2010-09-16 13 views
26

मैं बिलाव में एक कनेक्शन पूल C3P0 उपयोग कर रहा हूँ, और मैं बहुत चिंताजनक त्रुटियों दिखाई दे रही है:सी 3 पी 0 स्पष्ट डेडलॉक जब धागे सभी खाली हैं?

2010-09-16 13:25:00,160 [Timer-0] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner - com[email protected]43502400 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
2010-09-16 13:25:01,407 [Timer-0] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner - com[email protected]43502400 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 10 
    Active Threads: 0 
    Active Tasks: 
    Pending Tasks: 
    com.mchange.[email protected]6e4151a7 
    Pool thread stack traces: 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6,5,main] 
    java.lang.Object.wait(Native Method) 
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534) 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main] 
    java.lang.Object.wait(Native Method) 
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534) 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main] 
    java.lang.Object.wait(Native Method) 
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534) 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main] 
    java.lang.Object.wait(Native Method) 
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534) 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5,5,main] 
    java.lang.Object.wait(Native Method) 
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534) 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,main] 
    java.lang.Object.wait(Native Method) 

... many more, exact same stack trace 

लाइन 534 है:

while (true) { 
    Runnable myTask; 
    synchronized (ThreadPoolAsynchronousRunner.this) { 
    while (!should_stop && pendingTasks.size() == 0) 
     ThreadPoolAsynchronousRunner.this.wait(POLL_FOR_STOP_INTERVAL); // <- here 
    if (should_stop) ... 

ऐसा लगता है कि बहुत ज्यादा की तरह सभी धागे हैं बेकार। वे काम की प्रतीक्षा कर रहे हैं। 0 सक्रिय धागे, और पूरा करने के लिए केवल 1 कार्य। क्या गलत हो रहा है पर कोई संकेत?

ds.setUser(userName); 
ds.setPassword(password); 
ds.setMaxPoolSize(16); 
ds.setMaxConnectionAge(1800); 
ds.setAcquireRetryAttempts(4); 
ds.setMaxIdleTime(900); 
ds.setNumHelperThreads(10); 
ds.setCheckoutTimeout(1000); 
+0

क्या आप अपनी समस्या का समाधान करने में सक्षम थे? (मुझे पता है कि यह बहुत लंबा समय रहा है) – Ittai

+0

@Ittai: नहीं, लेकिन अंत में यह चला गया। कोई संकेत नहीं कि यह वास्तव में क्या तय करता है :-( –

उत्तर

6

यह लगता है कि आप पहले से ही पूल से कनेक्शन प्राप्त किया है और कुछ ही समय में इसे वापस नहीं है:

यहाँ विन्यास है।

सी 3 पी 0 कनेक्शन प्राप्त होने पर "स्पष्ट डेडलॉक्स" निर्धारित करता है लेकिन डेडलॉक पहचान समय समाप्ति के भीतर पूल में वापस नहीं आ जाता है।

यदि आप "एक्शन" के करीब कनेक्शन अधिग्रहण को स्थानांतरित करते हैं और डेटाबेस कार्य पूरा होने के तुरंत बाद इसे पूल में वापस कर देते हैं, तो यह संदेश गायब हो जाएगा।

+2

प्रलेखन कहता है कि setMaxAdministrativeTime 0 (यानी हमेशा के लिए) पर डिफ़ॉल्ट है। इसके अतिरिक्त, मुझे किसी निश्चित समय सीमा में पूल से कनेक्शन क्यों वापस करना होगा? मैंने इसे चेक आउट किया है; जब तक मुझे इसकी आवश्यकता हो, तब तक मेरा होना चाहिए ... और यदि नहीं, तो यह एक डेडलॉक नहीं है! –

+1

आप सही हैं, यही कारण है कि चेतावनी अलग-अलग डेडलॉक कहती है। और वैसे, आप कनेक्शन पूल का उपयोग करते हैं ताकि आप ऐसा कर सकें जब आप इसका उपयोग नहीं करते हैं तो कनेक्शन को रखने की आवश्यकता नहीं है –

+1

निश्चित रूप से, लेकिन प्रश्न में जगह लंबे समय से चलने वाले लेनदेन में हो सकती है, जिसके दौरान आप इसे जारी नहीं कर सकते हैं। –

3

यह बाहर आपकी समस्या को हल करेंगे

ds.setMaxStatements(1000); 
ds.setMaxStatementsPerConnection(100); (the maximum number of prepared statments your system can execute on a single connection) 

जांच: https://forum.hibernate.org/viewtopic.php?t=947246&highlight=apparent+deadlock+c3p0

अपने बयानों को बंद करने के लिए याद रखें के बाद आप उनके साथ किया जाता है !!

0

मैं एक ही था सही ढंग से वक्तव्य और ResultSet उदाहरणों बंद करके हल समस्या (पता लगाने में असमर्थ था) (किसी भी तरह खुली हुई छोड़ दिया):

String SQL = "SELECT 1"; 
try { 
    con = DriverManager.getConnection(host, userName, userPassword); 
    stmt = con.prepareStatement(SQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 
    try { 
     rs = stmt.executeQuery(SQL); 
     try { 
      rs.next(); 
      // ... 
     } finally { 
      rs.close(); 
     } 
    } finally { 
     stmt.close(); 
    } 
} catch (SQLException ex) { 
    Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex); 
} 
11

मैं सिर्फ एक Oracle डाटाबेस के खिलाफ इसी तरह की एक समस्या आ रही है, लेकिन में मेरी मामला Managed Thread और Active Thread गणना समान थी।

Managed Threads: 3 
    Active Threads: 3 

मेरे लिए यह वास्तव में एक प्रमाणीकरण त्रुटि थी, बल्कि रास्ते से मैं लॉगिन ऑडिटिंग कर रहा था APPARENT DEADLOCK त्रुटि के रूप में दिखाई दिया।

2013-08-12 11:29:04,910 [Timer-4] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner: com[email protected]34996454 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
    2013-08-12 11:29:04,914 [Timer-4] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner: com[email protected]34996454 -- APPARENT DEADLOCK!!! Complete Status: 
      Managed Threads: 3 
      Active Threads: 3 
      Active Tasks: 
        [email protected]44 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
        [email protected]49 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
        [email protected]5 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
      Pending Tasks: 
        [email protected]d7 
    Pool thread stack traces: 
      Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main] 
        java.net.SocketInputStream.socketRead0(Native Method) 
        java.net.SocketInputStream.read(SocketInputStream.java:150) 
        java.net.SocketInputStream.read(SocketInputStream.java:121) 
        oracle.net.ns.Packet.receive(Packet.java:300) 
        oracle.net.ns.DataPacket.receive(DataPacket.java:106) 
        oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:260) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:185) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:102) 
        oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124) 
        oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) 
        oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) 
        oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290) 
        oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) 
        oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380) 
        oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760) 
        oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401) 
        oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546) 
        oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236) 
        oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
        oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521) 
        com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134) 
        com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182) 
        com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171) 
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137) 
        com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014) 
        com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32) 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810) 
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 
      Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main] 
        java.net.SocketInputStream.socketRead0(Native Method) 
        java.net.SocketInputStream.read(SocketInputStream.java:150) 
        java.net.SocketInputStream.read(SocketInputStream.java:121) 
        oracle.net.ns.Packet.receive(Packet.java:300) 
        oracle.net.ns.DataPacket.receive(DataPacket.java:106) 
        oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:260) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:185) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:102) 
        oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124) 
        oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) 
        oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) 
        oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290) 
        oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) 
        oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380) 
        oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760) 
        oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401) 
        oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546) 
        oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236) 
        oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
        oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521) 
        com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134) 
        com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182) 
        com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171) 
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137) 
        com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014) 
        com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32) 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810) 
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 
      Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main] 
        java.net.SocketInputStream.socketRead0(Native Method) 
        java.net.SocketInputStream.read(SocketInputStream.java:150) 
        java.net.SocketInputStream.read(SocketInputStream.java:121) 
        oracle.net.ns.Packet.receive(Packet.java:300) 
        oracle.net.ns.DataPacket.receive(DataPacket.java:106) 
        oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:260) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:185) 
        oracle.net.ns.NetInputStream.read(NetInputStream.java:102) 
        oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124) 
        oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) 
        oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) 
        oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290) 
        oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) 
        oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380) 
        oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760) 
        oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401) 
        oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546) 
        oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236) 
        oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
        oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521) 
        com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134) 
        com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182) 
        com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171) 
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137) 
        com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014) 
        com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32) 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810) 
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 
+6

क्या एक किकर है! मुझे कुछ प्रमुख वास्तुशिल्प परिवर्तनों के बाद यह त्रुटि मिल रही थी और इसलिए मैंने सोचा कि मैं इसे खराब कर दूंगा। जहां वास्तविक कारण आपके उत्तर से संबंधित था - क्योंकि मैं डेटाबेस सर्वर पर फ़ायरवॉल से नहीं जा सका! – HankCa

+0

अब भी यही समस्या थी। फ़ायरवॉल नियम के कारण फिर से। @HankCa नेतृत्व के लिए धन्यवाद। –

+0

मेरे लिए 100% स्पॉट, सुरक्षा समूह aws। – Gman

0

मैं एक ही समस्या थी है, लेकिन कारण के रूप में यह कुछ एक साथ एक ही समय में एक कनेक्शन प्राप्त करने का प्रयास संसाधनों के कारण हुई थी थोड़ा मुश्किल को पहचानना था।

जैसा कि आप पढ़ सकते हैं कि पूल को सेटअप फ़ंक्शन को कॉल करके प्रदान किए गए कोड को प्रारंभ नहीं किया गया था।

public Connection getConnection() throws SQLException { 
    if (mCPDS == null) { 
     setupPool(); 
    } 

    return mCPDS.getConnection(); 
} 

समस्या यह है कि कई संसाधनों कार्यक्रम इसलिए एक से अधिक पूल कुछ समय के बाद आपकी समस्या पैदा कर रहा instantiating रहे थे की शुरुआत में कनेक्शन प्राप्त करने के लिए कोशिश कर रहे थे।

समाधान केवल अन्य संसाधनों को रखने के लिए सिंक्रनाइज़ किए गए विधि को घोषित करने के लिए था, जबकि किसी ने विधि कहा है और यह अभी भी पूल को तुरंत चालू करने के अंदर है।

public synchronized Connection getConnection() throws SQLException { 
    if (mCPDS == null) { 
     setupPool(); 
    } 

    return mCPDS.getConnection(); 
} 

यह सिंगलटन का उपयोग न करने के लिए एक डिज़ाइन त्रुटि हो सकती है लेकिन कुछ प्रदर्शन की कमी की समस्या को हल करता है।

-1

हम इस समस्या का सामना किया और C3P0 config को यह जोड़कर इसे हल:

<property name="statementCacheNumDeferredCloseThreads" value="1"/> 

के अनुसार: this from the C3P0 doc

-1

इसी समस्या glassfish4 सर्वर पर का सामना करना पड़ा था, जबकि आवेदन की तैनाती। यह एक डेटाबेस विन्यास मुद्दा था बाहर निकला। बस सुनिश्चित करें कि आपकी डेटाबेस कनेक्टिविटी कॉन्फ़िगरेशन उचित हैं, सत्यापित करें कि कॉन्फ़िगरेशन में प्रदान किया गया होस्टनाम डेटाबेस से कनेक्शन की अनुमति देता है। कॉन्फ़िगर किए गए उपयोगकर्ता नाम और होस्टनाम/डोमेन के साथ डेटाबेस से मैन्युअल रूप से कनेक्ट करने का प्रयास करें। यदि आवश्यक हो, तो डीबी उपयोगकर्ता को आवश्यक डोमेन से कनेक्ट करने दें। एप्लिकेशन को सही डीबी कॉन्फ़िगरेशन के साथ पुनर्निर्माण करें और फिर इसे तैनात करें।

0

हाय मेरे दोस्त बस टिप्पणी करने के लिए, मेरे पास एक ही मामला था। मैंने बस अपनी वसंत-हाइबरनेट ग्रहण परियोजना को कॉन्फ़िगर किया और एक ही अपवाद दिखाया, यह ध्यान दिया जाना चाहिए कि मेरी परियोजना में अभी भी कोई प्रश्न नहीं है। -:

1) स्वच्छ परियोजना:> स्वच्छ ... 2) का निर्माण परियोजना परियोजना:

मैं नीचे दिए गए चरणों के साथ उस समस्या का समाधान परियोजना -> निर्माण परियोजना

मुझे आशा है कि यह काम करता है के लिए आप।

संबंधित मुद्दे