You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Romain Manni-Bucau (JIRA)" <ji...@apache.org> on 2016/07/05 11:00:15 UTC

[jira] [Updated] (DBCP-464) managed shared connections can lead to a NPE on close

     [ https://issues.apache.org/jira/browse/DBCP-464?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Romain Manni-Bucau updated DBCP-464:
------------------------------------
    Affects Version/s: 1.4
                       2.1

> managed shared connections can lead to a NPE on close
> -----------------------------------------------------
>
>                 Key: DBCP-464
>                 URL: https://issues.apache.org/jira/browse/DBCP-464
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 1.4, 2.1
>            Reporter: Romain Manni-Bucau
>
> 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:
> {code}
> @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 {
>                         // here is the additional check to do
>                         if (getDelegateInternal() == null) {
>                             return;
>                         }
>                         super.close();
>                     }
>                 };
>             }
>         };
>         pds.setAccessToUnderlyingConnectionAllowed(isAccessToUnderlyingConnectionAllowed());
>         return pds;
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)