[
https://issues.apache.org/jira/browse/DBCP-398?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13711783#comment-13711783
]
Phil Steitz commented on DBCP-398:
----------------------------------
Hi Tom,
Thanks for having a look at the code. The code you reference is correct per the
current (in need of better documentation) contract. When a connection is
returned by the client (by calling close on its handle), DBCP checks to make
sure that the underlying physical connection has not been closed. If that is
the case, something bad has happened - i.e., the physical connection has been
closed without the knowledge of the pool. In that case, the wrapper object is
*not* returned to the pool, but rather destroyed and an exception is generated
(so as not to silently ignore what could be an important infrastructure
problem).
If I understand your statements above about how you are using
PoolingDataSource, it should work correctly just calling close() on connection
handles, which really means "return me to the pool." In general, there is no
need to test isClosed() before returning a connection to the pool and, per
comments above, this is in general not a good thing to do. Also, if
connections being managed by the pool are being closed without the pool's
involvement, the root cause of this infrastructure problem should be determined
and resolved.
> 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