Uploaded image for project: 'Commons DBCP'
  1. Commons DBCP
  2. DBCP-464

managed shared connections can lead to a NPE on close

    XMLWordPrintableJSON

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

          Activity

            People

              Unassigned Unassigned
              romain.manni-bucau Romain Manni-Bucau
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: