2014-03-19 58 views
1

我有一個運行在tomcat上的java servlet應用程序,在tomcat中配置了c3p0。我有一個應用程序,僅供我的組織中的少數人使用。通常有3個或更少的人使用它,有時達到5個。所以,不是很多人。通常和不可預知的是,應用程序失敗,出現以下錯誤。通常在長時間的空閒時間(通宵)後發生,並在第二天的第一次請求中失敗。我有其他類似堆棧的生產應用程序沒有這個問題,但他們很少閒置。這裏的錯誤(是的,我已經計算器搜查,看過別人用類似的問題,但沒有解決方案似乎爲我工作):C3P0服務器閒置過夜後發生死鎖

WARNING: com[email protected]2a3252ed -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
Mar 19, 2014 6:42:11 AM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
WARNING: com[email protected]2a3252ed -- APPARENT DEADLOCK!!! Complete Status: 
     Managed Threads: 3 
     Active Threads: 3 
     Active Tasks: 
       com[email protected]b7eed31 
         on thread: C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#2 
       com[email protected]3a0631dc 
         on thread: C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#1 
       com[email protected]6cb38046 
         on thread: C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#0 
     Pending Tasks: 
       com[email protected]7caaab6a 
       com[email protected]28dbfc17 
       com.mcha[email protected]2835ef6 
       com.mcha[email protected]7ecf69c3 
       com.mcha[email protected]6328c23f 
       com.mcha[email protected]8e8e8f5 
       com.mcha[email protected]73163164 
       com[email protected]3604d743 
       com[email protected]77d08b69 
       com[email protected]1c70d7f3 
       com.mchange.v2.resourcepool.BasicResourcePoo[email protected] 
Pool thread stack traces: 
     Thread[C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#2,5,main] 
       java.net.SocketInputStream.socketRead0(Native Method) 
       java.net.SocketInputStream.read(SocketInputStream.java:146) 
       com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114) 
       com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161) 
       com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189) 
       com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3116) 
       com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3573) 
       com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3562) 
       com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4113) 
       com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) 
       com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) 
       com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2812) 
       com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2761) 
       com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1612) 
       com.mysql.jdbc.ConnectionImpl.getTransactionIsolation(ConnectionImpl.java:3352) 
       com.mchange.v2.c3p0.impl.NewPooledConnection.<init>(NewPooledConnection.java:125) 
       com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:211) 
       com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184) 
       com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200) 
       com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086) 
       com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073) 
       com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:44) 
       com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1810) 
       com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648) 
     Thread[C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#1,5,main] 
       com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:672) 
     Thread[C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#0,5,main] 
       com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:672) 

這是我在Tomcat中配置。在「大寫鎖」的相關文件被更改,以保護無辜:

<Resource name="jdbc/NAME_HERE" auth="Container" 
       description="DESCRIPTION" 
       jdbcUrl="jdbc:mysql://PATH_TO_RDS?autoReconnect=true" 
       user="USER" 
       password="PASS" 
       type="com.mchange.v2.c3p0.ComboPooledDataSource" 
       factory="org.apache.naming.factory.BeanFactory" 
       driverClass="com.mysql.jdbc.Driver" 
       maxPoolSize="50" 
       minPoolSize="10" 
       acquireIncrement="5" 
       acquireRetryAttempts="0" 
       acquireRetryDelay="3000" 
       breakAfterAcquireFailure="false" 
       maxConnectionAge="60" 
       maxIdleTime="30" 
       maxIdleTimeExcessConnections="10" 
       idleConnectionTestPeriod="15" 
       testConnectionOnCheckout="true" 
       preferredTestQuery="SELECT 1" 
       debugUnreturnedConnectionStackTraces="true" 
       autoCommitOnClose="true" 
    /> 

我使用的C3P0 0.9.2.1,mchange 0.2.3.4,並在服務器的MySQL 5.1.26連接器。我也在應用程序中使用hibernate 3.2.5.ga。

我不知道它是否重要,但我們使用亞馬遜的RDS,因此它不在本地主機上。

任何幫助,將不勝感激。這已經持續了一段時間,我試過在各種論壇上找到的所有東西,但都沒有運氣。

+0

在這一點上,我會嘗試一個不同的連接池。一個Tomcat連接池是一個不錯的現代替代方案https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html – anttix

+0

調試這些問題非常複雜,所以我懷疑你從stackoverflow得到答案。但你永遠不知道;) – anttix

+0

編輯:這是一個更好的鏈接Tomcat池文檔https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – anttix

回答

2

只是提供了一個答案,這一切都證明是一個JVM內存問題。 JVM將在一夜之間耗盡內存。我不知道爲什麼,但是這個服務器爲tomcat打開了一些特殊的垃圾收集器選項,當我刪除它們時,不僅問題消失了,而且該機器上的內存佔用空間更小。默認的垃圾收集器必須比正在使用的垃圾收集器更具侵略性。這個問題在幾個星期內沒有發生過,並且從來沒有涉及到c3p0,我不這麼認爲。 C3P0只是一個捕捉和報告問題。

+0

介意分享您使用的GC標誌?我現在正在經歷這個確切的問題,很想嘗試一下你的設置。謝謝 – phatduckk

+0

那麼,我刪除了壞旗,所以我不是100%確定,但我認爲我使用-XX:+ UseConcMarkSweepGC。我目前的設置是使用:JAVA_OPTS =「 - Djava.awt.headless = true -Xmx1536m -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath =/usr/share/tomcat7/dumps」。請注意,最後2個人在再次崩潰時接受堆轉儲,但由於刪除上述選項修復了這個問題,因此我從來不必處理這些問題。 – garagebrewer

+0

感謝@garagebrewer – phatduckk