Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Duplicate
-
1.4, 2.1
-
None
-
None
Description
in CompletionListener the delegate will be set to false but the connection will not be closed so when calling close later and if the connection exited a transaction context then it will try to close it and lead to a NPE
Here my workaround:
@Override protected DataSource createDataSourceInstance() throws SQLException { final TransactionRegistry transactionRegistry = getTransactionRegistry(); if (transactionRegistry == null) { throw new IllegalStateException("TransactionRegistry has not been set"); } if (getConnectionPool() == null) { throw new IllegalStateException("Pool has not been set"); } final PoolingDataSource<PoolableConnection> pds = new ManagedDataSource<PoolableConnection>(getConnectionPool(), transactionRegistry) { @Override public Connection getConnection() throws SQLException { return new ManagedConnection<PoolableConnection>(getPool(), transactionRegistry, isAccessToUnderlyingConnectionAllowed()) { @Override public void close() throws SQLException { if (!isClosedInternal()) { try { if (null != getDelegateInternal()) { super.close(); } } finally { setClosedInternal(true); } } } @Override public boolean isClosed() throws SQLException { return isClosedInternal() || null != getDelegateInternal() && getDelegateInternal().isClosed(); } }; } }; pds.setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed()); return pds; }
Attachments
Issue Links
- duplicates
-
DBCP-446 NullPointerException thrown when calling ManagedConnection.isClosed()
- Resolved
- is duplicated by
-
TOMEE-1860 Potential NPE with DBCP if a shared connection is closed
- Resolved