[
https://issues.apache.org/jira/browse/DBCP-398?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13710197#comment-13710197
]
Tom Lee commented on DBCP-398:
------------------------------
So does that mean the check on line 77 in the current implementation of
PoolableConnection is incorrect?
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp2/PoolableConnection.java?view=markup&pathrev=1431684
Looks like it's doing the one work of returning the connection to the pool.
For the record, we're using PoolingDataSource + QueryRunner from
commons-dbutils. QueryRunner doesn't concern itself with pooling & instead
relies on the underlying DataSource + Connection objects to borrow & return
objects respectively. Here, I think that means PoolingDataSource +
PoolableConnection:
* PoolingDataSource.getConnection() borrows the connection from the pool.
* PoolableConnection.close() should then return the connection to the pool.
How would we have PoolableConnection correctly return itself to the pool?
Neither our code nor QueryRunner seems to make any attempt to explicitly return
connections to the pool -- instead, both rely on the semantics of
PoolableConnection.close() to return the connection to the pool.
Entirely possible I'm getting confused here, just trying to clarify :)
> DBCP hangs on common pool borrowObject when PoolableConnection is used and
> the underlying connection closed unexpectedly (connection resets/timouts)
> ----------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: DBCP-398
> URL: https://issues.apache.org/jira/browse/DBCP-398
> Project: Commons Dbcp
> Issue Type: Bug
> Affects Versions: 1.2, 1.3, 1.4, 2.0
> Reporter: Sarvesh Sakalanaga
> Attachments: DBCP-398.0.patch
>
>
> The bug is in org.apache.commons.dbcp.PoolableConnection as isClosed method
> on this calls super.isClosed which returns true (as
> DelegatingConnection::isClosed { _closed || _conn.isClosed() }). Since
> PoolableConnection needs to release objects to pool even if the underlying
> connection is closed the isClosed method should be overridden in this class
> and should return _closed. This _closed is the delegating connection close
> which will be set to false even if the underlying connection is closed
> (_conn.isClosed). The fix should also not throw on PoolableConnection::Close
> method if underlying connection is closed as this state is a valid state and
> is expected.
> Also currently the way it stands the clients of PoolableConnection will/may
> not call Close() as isClosed always returns true in this case.
> Below is the stack that the thread hangs on:
> ◾waiting on <0x00000007b5a50e48> (a
> org.apache.commons.pool.impl.GenericObjectPool$Latch)
> at java.lang.Object.wait(Object.java:503)
> at
> org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
> ◾locked <0x00000007b5a50e48> (a
> org.apache.commons.pool.impl.GenericObjectPool$Latch)
> at
> org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
> at
> org.datanucleus.store.rdbms.ConnectionProviderPriorityList.getConnection(ConnectionProviderPriorityList.java:57)
> at
> org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.getConnection(ConnectionFactoryImpl.java:354)
> at
> org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.getXAResource(ConnectionFactoryImpl.java:314)
> at
> org.datanucleus.store.connection.ConnectionManagerImpl.enlistResource(ConnectionManagerImpl.java:386)
> at
> org.datanucleus.store.connection.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:252)
> at
> org.datanucleus.store.connection.AbstractConnectionFactory.getConnection(AbstractConnectionFactory.java:60)
> at
> org.datanucleus.store.AbstractStoreManager.getConnection(AbstractStoreManager.java:449)
> at
> org.datanucleus.store.AbstractStoreManager.getConnection(AbstractStoreManager.java:418)
> at
> org.datanucleus.store.rdbms.query.JDOQLQuery.performExecute(JDOQLQuery.java:595)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira