我在Tomcat日志中不断收到此异常:
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Complete Status: Managed Threads: 3 Active Threads: 3 Active Tasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1201fd18 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@408f3be4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7ba516d8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) Pending Tasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@137efe53 com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@766b0524 Pool thread stack traces: Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main] java.lang.Thread.sleep(Native Method) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805) com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main] java.lang.Thread.sleep(Native Method) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805) com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main] java.lang.Thread.sleep(Native Method) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805) com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
我正在将Hibernate 3.6.2和C3P0 0.9.1.2与MySQL一起使用。在搜索Google几个小时之后,此APPARENT DEADLOCK异常似乎通常与准备好的语句缓存相关联。这是我的hibernate.cfg.xml中的C3P0配置:
<propertyname="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.acquire_increment">5</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">60</property> <property name="hibernate.c3p0.idle_test_period">120</property> <property name="hibernate.c3p0.timeout">180</property> <property name="hibernate.c3p0.max_statements">0</property>
我不做任何缓存语句。任何关于这里出什么问题的暗示将不胜感激。
脱钩的任务是连接获取任务。也就是说,c3p0尝试从数据库中获取新的连接,而这些连接获取尝试花费了很长时间。
我要做的第一件事是升级到0.9.2.1,这在获取尝试有时会失败的情况下,可以大大改善执行一轮Connection获取的方式。
如果那不能解决您的问题,那么您需要弄清楚为什么c3p0尝试获取连接的尝试长时间挂起了:成功与失败都不会出现异常。