我有一個運行在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,因此它不在本地主機上。
任何幫助,將不勝感激。這已經持續了一段時間,我試過在各種論壇上找到的所有東西,但都沒有運氣。
在這一點上,我會嘗試一個不同的連接池。一個Tomcat連接池是一個不錯的現代替代方案https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html – anttix
調試這些問題非常複雜,所以我懷疑你從stackoverflow得到答案。但你永遠不知道;) – anttix
編輯:這是一個更好的鏈接Tomcat池文檔https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – anttix