我有一个在Tomcat上运行的Java Servlet应用程序,在Tomcat中配置了c3p0。我有一个组织内部只有少数人内部使用的应用程序。通常,只有3个或更少的人在使用它,有时多达5个。因此,不是很多人。通常,而且出乎意料的是,应用程序因以下错误而失败。通常,它在长时间的空闲时间(隔夜)后发生,并在第二天的第一个请求时失败。我还有其他生产应用程序,它们具有类似的堆栈,但没有这个问题,但是它们很少处于空闲状态。这是错误(是的,我已经搜索了stackoverflow并看到了其他类似问题,但似乎没有一种解决方案适合我):
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@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.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@2a3252ed -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@b7eed31
on thread: C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#2
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@3a0631dc
on thread: C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#1
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@6cb38046
on thread: C3P0PooledConnectionPoolManager[identityToken->2ykl7d901mnvek411mheiv|3a7f5639]-HelperThread-#0
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@7caaab6a
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@28dbfc17
com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@2835ef6
com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@7ecf69c3
com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@6328c23f
com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@8e8e8f5
com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask@73163164
com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@3604d743
com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@77d08b69
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@1c70d7f3
com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@3471a11b
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中的配置。更改了“ capslock”中的项目以保护无辜者:
<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。我还在应用程序中使用了休眠3.2.5.ga。
我不知道这是否重要,但我们使用来自Amazon的RDS,因此它不在localhost上。
任何帮助,将不胜感激。这已经持续了一段时间,我尝试了在各种论坛上都能找到的所有东西,但是没有运气。
最佳答案
仅提供一个答案,这全都是JVM内存问题。 JVM将在一夜之间耗尽内存。我不知道为什么,但是此服务器为tomcat打开了一些特殊的垃圾收集器选项,当我删除这些选项时,不仅问题消失了,而且该计算机上的内存占用量也要小得多。默认的垃圾收集器必须比正在使用的垃圾收集器更具攻击性。我认为问题已经好几周没有发生了,并且从未与c3p0相关。 C3P0只是一个捕获和报告问题的人。
关于java - 服务器整夜闲置后出现C3P0死锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22513152/