RefurbishCheckinResourceTask上的c3p0死锁,getConnection() [英] c3p0 deadlock on RefurbishCheckinResourceTask, getConnection()

查看:209
本文介绍了RefurbishCheckinResourceTask上的c3p0死锁,getConnection()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在tomcat6上部署了一个webApp,它有一个导入消息函数,它将导入大量消息并将它们保存到Oracle 11g数据库中。



I 'code $>死锁偶尔/不可预知,运行一段时间后导入。



/ strong>:

  7août2014 13:04:38 com.mchange.v2.async.ThreadPoolAsynchronousRunner $ DeadlockDetector run 
注意:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@637d7dd6 - APPARENT DEADLOCK !!!为未分配的待处理任务创建紧急线程!
7août2014 13:04:38 com.mchange.v2.async.ThreadPoolAsynchronousRunner $ DeadlockDetector运行
注意:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@637d7dd6 - APPARENT DEADLOCK !!!完成状态:
管理线程:8
活动线程数:8
活动任务:
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@55e4ef4e(com.mchange.v2。 async.ThreadPoolAsynchronousRunner $ PoolThread-#0)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@45460ed4(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#3)
com.mchange。 v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@49da1926(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#7)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@14bc659d(com.mchange.v2.async .ThreadPoolAsynchronousRunner $ PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@78597c06(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#4)
com.mchange.v2 .resourcepool.BasicResourcePool $ 1RefurbishCheckinResourc eTask @ 6667f88e(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#5)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@2a5d8dbb(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-# 6)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@441364ad(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#2)
等待任务:
com.mchange。 v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7ca35537
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@1370b3e5
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@9d7dc72
com.mchange .v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask @ 14bfd04d
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@3d0479df
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinR esourceTask @ 27310c3a
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@519c7f0
池线程堆栈跟踪:
线程[com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#0, 5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
Thread [com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#3,5 ,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
Thread [com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#7,5,主]
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
线程[com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#1,5,main ]
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
Thread [com.mchange.v2。 async.ThreadPoolAsynchronousRunner $ PoolThread-#4,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
Thread [com.mchange.v2.async .ThreadPoolAsynchronousRunner $ PoolThread-#5,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
Thread [com.mchange.v2.async。 ThreadPoolAsynchronousRunner $ PoolThread-#6,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
Thread [com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#2,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:562)


7août2014 13 :05:13 com.mchange.v2.async.ThreadPoolAsynchronousRunner $ DeadlockDetector运行
注意:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@637d7dd6 - APPARE NT DEADLOCK !!!为未分配的待处理任务创建紧急线程!
7août2014 13:05:13 com.mchange.v2.async.ThreadPoolAsynchronousRunner $ DeadlockDetector运行
注意:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@637d7dd6 - APPARENT DEADLOCK !!!完成状态:
管理主题:8
活动主题:8
活动任务:
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@62ac4df7(com.mchange.v2。 async.ThreadPoolAsynchronousRunner $ PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@e8fdc6f(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#0)
com.mchange。 v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@4140546(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#3)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@70a25e6b(com.mchange.v2.async .ThreadPoolAsynchronousRunner $ PoolThread-#7)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@33e4fc92(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#2)
com.mchange.v2 .resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceT请问@ 4a6064a4(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#4)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@466c6e60(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-# 6)
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@27e87047(com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#5)
等待任务:
com.mchange。 v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@bdba1dc
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7be684ff
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@b9b2923
com.mchange .v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask @ 292c79d8
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@26f36906
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinReso urceTask @ 114d8aa
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7bf6e678
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@5c447da5
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask @ 14950af6
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@3124219d
com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7a92974e
池线程堆栈跟踪:
线程[com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#1,5,main]
org.netbeans.lib.profiler.server.ProfilerRuntimeMemory.getAndSendCurrentStackTrace(ProfilerRuntimeMemory.java:221)
org.netbeans.lib.profiler.server.ProfilerRuntimeObjLiveness.traceObjAlloc(ProfilerRuntimeObjLiveness.java:281)
com.mchange.v2.c3p0.impl.NewProxyConnection。< init>(NewProxyConnection.java:32)
com.mchange .v2.c3p0.impl.NewProxyConnection。< init>(NewProxyConnection.java:1376)
com.mchange.v2.c3p0.impl.NewPooledConnection.getConnection(NewPooledConnection.java:151)
com。
com.mchange。 v2.resourcepool.BasicResourcePool.access $ 200(BasicResourcePool.java:32)
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
com.mchange.v2.async .ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
Thread [com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#0,5,main]
org.netbeans.lib.profiler。 server.ProfilerRuntimeMemory.getAndSendCurrentStackTrace(ProfilerRuntimeMem ory.java:221)
org.netbeans.lib.profiler.server.ProfilerRuntimeObjLiveness.traceObjAlloc(ProfilerRuntimeObjLiveness.java:281)
com.mchange.v2.c3p0.impl.NewProxyConnection<初始化> (NewProxyConnection.java:32)
com.mchange.v2.c3p0.impl.NewProxyConnection。< init>(NewProxyConnection.java:1376)
com.mchange.v2.c3p0.impl.NewPooledConnection。 getConnection(NewPooledConnection.java:151)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:285)
com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin( BasicResourcePool.java:1615)
com.mchange.v2.resourcepool.BasicResourcePool.access $ 200(BasicResourcePool.java:32)
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask.run(BasicResourcePool.java :1228)
com.mchange.v2.async.ThreadPoolAsynchronousRun ner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
Thread [com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#3,5,main]
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1229)
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
Thread [com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#7,5,main]
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1229)
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread。运行(ThreadPoolAsynchronousRunner.java:557)
线程[com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#2,5,main]
org.netbeans.lib.profiler.server.ProfilerRuntimeMemory.getAndSendCurrentStackTrace (ProfilerRuntimeMemory.java:221)
org.netbeans.lib.profiler.server.ProfilerRuntimeObjLiveness .traceObjAlloc(ProfilerRuntimeObjLiveness.java:281)
java.util.HashMap.addEntry(未知源)
java.util.HashMap.put(未知源)
java.util.HashSet.add (未知来源)
com.mchange.v2.c3p0.util.ConnectionEventSupport.addConnectionEventListener(ConnectionEventSupport.java:39)
com.mchange.v2.c3p0.impl.NewPooledConnection.addConnectionEventListener(NewPooledConnection.java: 194)
$ com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool 1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:290)
com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1615)
com.mchange.v2.resourcepool.BasicResourcePool.access $ 200(BasicResourcePool.java:32)
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
com.mchange.v2.async.ThreadPoolAsynchro nousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
Thread [com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#4,5,main]
org.netbeans.lib.profiler.server .ProfilerRuntimeMemory.getAndSendCurrentStackTrace(ProfilerRuntimeMemory.java:221)
org.netbeans.lib.profiler.server.ProfilerRuntimeObjLiveness.traceObjAlloc(ProfilerRuntimeObjLiveness.java:281)
java.util.HashMap.clone(Unknown Source)
java.util.HashSet.clone(未知源)
com.mchange.v2.c3p0.util.ConnectionEventSupport.fireConnectionClosed(ConnectionEventSupport.java:49)
com.mchange.v2.c3p0 .impl.NewPooledConnection.fireConnectionClosed(NewPooledConnection.java:439)
com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:318)
com.mchange.v2.c3p0.impl .NewProxyConnection.close(NewProxyConnection.java:1246)
com.mchange.v1.db.sql.ConnectionUtils.attemptC (ConnectionUtils.java:41)
com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:292)
com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin( BasicResourcePool.java:1615)
com.mchange.v2.resourcepool.BasicResourcePool.access $ 200(BasicResourcePool.java:32)
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask.run(BasicResourcePool.java :1228)
com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
Thread [com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#6,5,主]
$ com.mchange.v2.resourcepool.BasicResourcePool 1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1229)
$ com.mchange.v2.async.ThreadPoolAsynchronousRunner PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
线程[com.mch ange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread-#5,5,main]
com.mchange.v2.resourcepool.BasicResourcePool $ 1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1229)
com.mchange.v2 .async.ThreadPoolAsynchronousRunner $ PoolThread.run(ThreadPoolAsynchronousRunner.java:557)

似乎有很多的RefurbishCheckinResourceTask,根据跟踪, c3p0 无法达到 getConnection 。我使用 Spring hibernate c3p0



我的c3p0配置

 < ; bean id =pmiDataSourceclass =com.mchange.v2.c3p0.ComboPooledDataSource
destroy-method =close>
< property name =driverClassvalue =oracle.jdbc.driver.OracleDriver/>
< property name =jdbcUrlvalue =jdbc:oracle:thin:********/>
< property name =uservalue =****/>
< property name =passwordvalue =****/>
< property name =acquireIncrementvalue =5/>
< property name =numHelperThreadsvalue =6/>
< property name =minPoolSizevalue =10/>
< property name =initialPoolSizevalue =15/>
< property name =maxPoolSizevalue =25/>
< / bean>

我的hibernate属性

 < property name =hibernateProperties> 
<值>
hibernate.dialect = org.hibernate.dialect.Oracle10gDialect
hibernate.auto_close_session = true
hibernate.validator.autoregister_listeners = false
hibernate.validator.apply_to_ddl = false
hibernate.cache.use_second_level_cache = true
hibernate.cache.region.factory_class = net.sf.ehcache.hibernate.EhCacheRegionFactory
hibernate.cache.use_query_cache = false
javax.persistence.validation.mode = none
hibernate.generate_statistics = true
< / value>
< / property>

我已经查了很多关于此的论坛,其中最相似的案例就是这个。
c3p0明显的死锁/创建紧急线程
一>。
APPARENT DEADLOCK 0.9.1.2



有人可以帮忙吗?

解决方案

这不是c3p0问题,实际上它是我自己的错。 / p>

我使用 TaskExecutor 来运行多线程内部runnalbe任务。由于这个过程调用了从内部实例到外部类方法,它必须处理同步问题,我首先忽略了这个问题。



当内部实例运行由于同步而导致一些错误,它会阻止某些c3p0连接返回到连接池



所以这原来是外部内部类实例方法调用问题。只需要小心同步问题。有时错误不会显示在开发机器上,但是一旦它发布在一个功能更强大的多核处理器上,错误就很容易发生。

>

I've a webApp deployed on tomcat6, there's an import message function, which will import a large amount of messages persisting them into an Oracle 11g database.

I'm getting the deadlock occasionally/unpredictably, after running import for a while.

The trace:

7 août 2014 13:04:38 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
ATTENTION: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@637d7dd6 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
7 août 2014 13:04:38 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
ATTENTION: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@637d7dd6 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 8
    Active Threads: 8
    Active Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@55e4ef4e (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@45460ed4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@49da1926 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#7)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@14bc659d (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@78597c06 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@6667f88e (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@2a5d8dbb (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@441364ad (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
    Pending Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7ca35537
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@1370b3e5
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@9d7dc72
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@14bfd04d
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@3d0479df
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@27310c3a
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@519c7f0
Pool thread stack traces:
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3,5,main]
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#7,5,main]
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,main]
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5,5,main]
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6,5,main]
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)


7 août 2014 13:05:13 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
ATTENTION: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@637d7dd6 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
7 août 2014 13:05:13 com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
ATTENTION: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@637d7dd6 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 8
    Active Threads: 8
    Active Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@62ac4df7 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@e8fdc6f (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@4140546 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@70a25e6b (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#7)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@33e4fc92 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@4a6064a4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@466c6e60 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@27e87047 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5)
    Pending Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@bdba1dc
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7be684ff
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@b9b2923
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@292c79d8
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@26f36906
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@114d8aa
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7bf6e678
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@5c447da5
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@14950af6
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@3124219d
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@7a92974e
Pool thread stack traces:
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
        org.netbeans.lib.profiler.server.ProfilerRuntimeMemory.getAndSendCurrentStackTrace(ProfilerRuntimeMemory.java:221)
        org.netbeans.lib.profiler.server.ProfilerRuntimeObjLiveness.traceObjAlloc(ProfilerRuntimeObjLiveness.java:281)
        com.mchange.v2.c3p0.impl.NewProxyConnection.<init>(NewProxyConnection.java:32)
        com.mchange.v2.c3p0.impl.NewProxyConnection.<init>(NewProxyConnection.java:1376)
        com.mchange.v2.c3p0.impl.NewPooledConnection.getConnection(NewPooledConnection.java:151)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:285)
        com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1615)
        com.mchange.v2.resourcepool.BasicResourcePool.access$200(BasicResourcePool.java:32)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
        org.netbeans.lib.profiler.server.ProfilerRuntimeMemory.getAndSendCurrentStackTrace(ProfilerRuntimeMemory.java:221)
        org.netbeans.lib.profiler.server.ProfilerRuntimeObjLiveness.traceObjAlloc(ProfilerRuntimeObjLiveness.java:281)
        com.mchange.v2.c3p0.impl.NewProxyConnection.<init>(NewProxyConnection.java:32)
        com.mchange.v2.c3p0.impl.NewProxyConnection.<init>(NewProxyConnection.java:1376)
        com.mchange.v2.c3p0.impl.NewPooledConnection.getConnection(NewPooledConnection.java:151)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:285)
        com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1615)
        com.mchange.v2.resourcepool.BasicResourcePool.access$200(BasicResourcePool.java:32)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3,5,main]
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1229)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#7,5,main]
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1229)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
        org.netbeans.lib.profiler.server.ProfilerRuntimeMemory.getAndSendCurrentStackTrace(ProfilerRuntimeMemory.java:221)
        org.netbeans.lib.profiler.server.ProfilerRuntimeObjLiveness.traceObjAlloc(ProfilerRuntimeObjLiveness.java:281)
        java.util.HashMap.addEntry(Unknown Source)
        java.util.HashMap.put(Unknown Source)
        java.util.HashSet.add(Unknown Source)
        com.mchange.v2.c3p0.util.ConnectionEventSupport.addConnectionEventListener(ConnectionEventSupport.java:39)
        com.mchange.v2.c3p0.impl.NewPooledConnection.addConnectionEventListener(NewPooledConnection.java:194)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:290)
        com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1615)
        com.mchange.v2.resourcepool.BasicResourcePool.access$200(BasicResourcePool.java:32)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,main]
        org.netbeans.lib.profiler.server.ProfilerRuntimeMemory.getAndSendCurrentStackTrace(ProfilerRuntimeMemory.java:221)
        org.netbeans.lib.profiler.server.ProfilerRuntimeObjLiveness.traceObjAlloc(ProfilerRuntimeObjLiveness.java:281)
        java.util.HashMap.clone(Unknown Source)
        java.util.HashSet.clone(Unknown Source)
        com.mchange.v2.c3p0.util.ConnectionEventSupport.fireConnectionClosed(ConnectionEventSupport.java:49)
        com.mchange.v2.c3p0.impl.NewPooledConnection.fireConnectionClosed(NewPooledConnection.java:439)
        com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:318)
        com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:1246)
        com.mchange.v1.db.sql.ConnectionUtils.attemptClose(ConnectionUtils.java:41)
        com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.refurbishResourceOnCheckin(C3P0PooledConnectionPool.java:292)
        com.mchange.v2.resourcepool.BasicResourcePool.attemptRefurbishResourceOnCheckin(BasicResourcePool.java:1615)
        com.mchange.v2.resourcepool.BasicResourcePool.access$200(BasicResourcePool.java:32)
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1228)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6,5,main]
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1229)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:557)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5,5,main]
        com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask.run(BasicResourcePool.java:1229)
        com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:557)

It seems that there are plenty of RefurbishCheckinResourceTask, and according to the trace, c3p0 fails to getConnection. I'm using Spring, hibernate, c3p0.

My c3p0 configuration:

<bean id="pmiDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="jdbc:oracle:thin:********" />
    <property name="user" value="****" />
    <property name="password" value="****" />
    <property name="acquireIncrement" value="5" />
    <property name="numHelperThreads" value="6" />
    <property name="minPoolSize" value="10" />
    <property name="initialPoolSize" value="15" />
    <property name="maxPoolSize" value="25" />
</bean>

My hibernate properties:

<property name="hibernateProperties">
    <value>
        hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
        hibernate.auto_close_session=true
        hibernate.validator.autoregister_listeners=false
        hibernate.validator.apply_to_ddl=false
        hibernate.cache.use_second_level_cache=true
        hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.EhCacheRegionFactory
        hibernate.cache.use_query_cache=false
        javax.persistence.validation.mode=none
        hibernate.generate_statistics=true
    </value>
</property>

I've checked a lot of forum about this, one of the most similar case was this. c3p0 apparent deadlock / creating emergency threads. APPARENT DEADLOCK 0.9.1.2

Could some help please?

解决方案

It's not a c3p0 problem, in fact its my own fault.

I used a TaskExecutor to run a multi-treaded inner runnalbe task. Since this procedure makes call from inner instance to outer class method, it has to deal with the synchronization problem, which I ignored in the first place.

When the inner instances run into some error due to synchronization, it will block some c3p0 connection from returning back to the connection-pool.

So this turned out to be an outer-inner-class instance method call problem. Just need to be careful with synchronization issues.

Sometimes the error won't show on a development machine, but once it's published on a more powerful production machine with many cores, the error can easily happen.

这篇关于RefurbishCheckinResourceTask上的c3p0死锁,getConnection()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆