[ http://issues.apache.org/jira/browse/DBCP-65?page=comments#action_12452488 ] Phil Steitz commented on DBCP-65: ---------------------------------
I am +1 on option 2, or just migrate to Pool 2 when it is released. Having spent many hours trying to find workarounds for this and DBCP-44 (trying to do things like 1 outside of [pool], which is hopeless), I agree that the current evictor setup is a recipe for deadlocks and can't be fixed without changes to [pool] or [dbcp] config semantics. > [dbcp] Deadlock when evicting dbcp objects (testWhileIdle=true) > --------------------------------------------------------------- > > Key: DBCP-65 > URL: http://issues.apache.org/jira/browse/DBCP-65 > Project: Commons Dbcp > Issue Type: Bug > Environment: Operating System: All > Platform: All > Reporter: Wang Xianzhu > Fix For: 1.3 > > > The GenericKeyedObjectPool$Evictor thread has probability of deadlock with > dbcp > objects. > For example, at a certain time, a normal user thread calls a PoolingConnection > object's synchronized method, which in turn calls GenericKeyedObjectPool > object's synchronzied method. > At the same time, the evictor thread calls the GenericKeyedObjectPool object's > synchronized method 'evict', which in turn calls the PoolingConnection > object's > synchronized method. When testWhileIdle=true, the probability of evictor > calling GenericKeyedObjectPool's synchronized method is much greater. > The following is the deadlock information in the thread dump of our program > (testWhileIdle=true): > "Thread-106": > at > org.apache.commons.dbcp.AbandonedTrace.removeTrace(AbandonedTrace.java:221) > - waiting to lock <0x6a6b1b80> (a > org.apache.commons.dbcp.PoolingConnection) > at > org.apache.commons.dbcp.PoolablePreparedStatement.passivate(PoolablePreparedStatement.java:100) > at > org.apache.commons.dbcp.PoolingConnection.passivateObject(PoolingConnection.java:239) > at > org.apache.commons.pool.impl.GenericKeyedObjectPool.evict(GenericKeyedObjectPool.java:1001) > - locked <0x6a6b1858> (a > org.apache.commons.pool.impl.GenericKeyedObjectPool) > at > org.apache.commons.pool.impl.GenericKeyedObjectPool$Evictor.run(GenericKeyedObjectPool.java:1156) > at java.lang.Thread.run(Thread.java:534) > "Thread-41": > at > org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:715) > - waiting to lock <0x6a6b1858> (a > org.apache.commons.pool.impl.GenericKeyedObjectPool) > at > org.apache.commons.dbcp.PoolingConnection.prepareStatement(PoolingConnection.java:87) > - locked <0x6a6b1b80> (a org.apache.commons.dbcp.PoolingConnection) > at > org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:185) > at > org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:278) > ... > This problem can be worked around by setting testWhileIdle to false, although > there is still very small possibility of deadlock. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
