              Apache Apache Commons DBCP
              Version 2.9.0
              RELEASE NOTES

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.9.0.

Apache Commons DBCP software implements Database Connection Pooling.

This is a minor release, including bug fixes and enhancements.

Changes in this version include:

New features:
o            Add and reuse Constants.KEY_USER and Constants.KEY_PASSWORD. Thanks to Gary Gregory.
o            Add and reuse DataSourceMXBean. Thanks to Frank Gasdorf, Gary Gregory.
o            Add and reuse DriverAdapterCPDS.{get|set}DurationBetweenEvictionRuns(), deprecate {get|set}TimeBetweenEvictionRunsMillis(long). Thanks to Gary Gregory.
o            Add and reuse DriverAdapterCPDS.{get|set}MinEvictableIdleDuration(), deprecate {get|set}MinEvictableIdleTimeMillis(int). Thanks to Gary Gregory.
o            Add and reuse CPDSConnectionFactory.setMaxConnLifetime(Duration), deprecate setMaxConnLifetimeMillis(long). Thanks to Gary Gregory.
o            Add and reuse KeyedCPDSConnectionFactory.setMaxConnLifetime(Duration), deprecate setMaxConnLifetimeMillis(long). Thanks to Gary Gregory.
o            Add and reuse KeyedCPDSConnectionFactory.setMaxConnLifetime(Duration), deprecate setMaxConnLifetimeMillis(long). Thanks to Gary Gregory.
o            Add and reuse InstanceKeyDataSource.{get|set}DefaultMaxWait(Duration), deprecate {get|set}DefaultMaxWaitMillis(long). Thanks to Gary Gregory.

Fixed Bugs:
o DBCP-569:  Fix test random failure on TestSynchronizationOrder.testInterposedSynchronization, #84. Thanks to Florent Guillaume.
o DBCP-568:  ManagedConnection must clear its cached state after transaction completes, #75. Thanks to Florent Guillaume.
o            Minor Improvements #78. Thanks to Arturo Bernal.
o DBCP-567:  Use abort rather than close to clean up abandoned connections. Thanks to Phil Steitz, Gary Gregory, Phil Steitz, Romain Manni-Bucau.
o            Performance Enhancement: Call toArray with Zero Array Size #20. Thanks to Gary Gregory, DaGeRe.
o DBCP-562:  Avoid exposing password via JMX #38. Thanks to Frank Gasdorf, Gary Gregory.
o DBCP-575:  Remove redundant initializers #98. Thanks to Arturo Bernal.
o DBCP-577:  Simplify test assertions #100, #113. Thanks to Arturo Bernal.
o DBCP-573:  DataSource implementations do not implement Wrapper interface correctly #93. Thanks to Réda Housni Alaoui, Gary Gregory.
o            Replace FindBugs with SpotBugs.
o            DataSourceConnectionFactory.getUserPassword() may expose internal representation by returning DataSourceConnectionFactory.userPassword.
o            DataSourceXAConnectionFactory.getUserPassword() may expose internal representation by returning DataSourceXAConnectionFactory.userPassword.
o            DriverAdapterCPDS.getPasswordCharArray() may expose internal representation by returning DriverAdapterCPDS.userPassword.
o            new org.apache.commons.dbcp2.managed.DataSourceXAConnectionFactory(TransactionManager, XADataSource, String, char[], TransactionSynchronizationRegistry) may expose internal representation by storing an externally mutable object into DataSourceXAConnectionFactory.userPassword.
o            org.apache.commons.dbcp2.managed.DataSourceXAConnectionFactory.setPassword(char[]) may expose internal representation by storing an externally mutable object into DataSourceXAConnectionFactory.userPassword.
o            org.apache.commons.dbcp2.PStmtKey.getColumnIndexes() may expose internal representation by returning PStmtKey.columnIndexes.
o            org.apache.commons.dbcp2.PStmtKey.getColumnNames() may expose internal representation by returning PStmtKey.columnNames.
o DBCP-578:  Use Collections.synchronizedList() Instead Of Vector #101. Thanks to Arturo Bernal.
o DBCP-576:  Simplify and inline variables #99. Thanks to Arturo Bernal.
o            Update PoolKey#toString() to avoid revealing a user name is here. Thanks to Gary Gregory.
o            Internal package private UserPassKey class stores its user name as a char[] as it already does the password. Thanks to Gary Gregory.
o DBCP-579:  Performance of DelegatingConnection.prepareStatement(String) regressed enormously in 2.8.0 compared to 1.4.
             DelegatingConnection should also cache connection schema string to avoid calling the Connection#getSchema() for each key creation.
             DelegatingConnection should also cache connection catalog string to avoid calling the Connection#getCatalog() for each key creation. Thanks to Shaktisinh Jhala, Gary Gregory.
o            BasicDataSource should test for the presence of a security manager dynamically, not once on initialization. Thanks to Gary Gregory.

Changes:
o            Bump mockito-core from 3.5.11 to 3.11.2 #66, #72, #77, #85, #91, #105, #110, #116. Thanks to Dependabot.
o            Bump actions/checkout from v2.3.2 to v2.3.4 #65, #74. Thanks to Dependabot.
o            Bump actions/cache from v2 to v2.1.6 #90, #108. Thanks to Dependabot.
o            Bump commons-pool2 from 2.8.1 to 2.9.0. Thanks to Gary Gregory.
o            Bump actions/setup-java from v1.4.2 to v2 #69. Thanks to Dependabot, Gary Gregory.
o            Bump japicmp-maven-plugin from 0.14.3 to 0.15.2 #71, #82. Thanks to Dependabot, Gary Gregory.
o            Bump maven-pmd-plugin from 3.13.0 to 3.14.0 #76. Thanks to Dependabot.
o            Bump japicmp-maven-plugin from 0.14.4 to 0.15.3, #83. Thanks to Dependabot, Gary Gregory.
o            Bump Hamcrest 1.3 -> 2.2 #70. Thanks to John Patrick.
o            Bump maven-checkstyle-plugin from 3.1.1 to 3.1.2 #88. Thanks to Gary Gregory.
o            Bump junit-jupiter from 5.7.0 to 5.8.0-M1, #89, #106. Thanks to Gary Gregory.
o            Bump narayana-jta from 5.10.6.Final to 5.12.0.Final #103, #111. Thanks to Dependabot.
o            Bump maven-javadoc-plugin from 3.2.0 to 3.3.0 #107. Thanks to Dependabot.
o            Bump commons.jacoco.version 0.8.6 -> 0.8.7. Thanks to Gary Gregory.
o            Bump jboss-logging from 3.4.1.Final to 3.4.2.Final #109. Thanks to Dependabot.
o            Bump org.jboss:jboss-transaction-spi from 7.6.0.Final to 7.6.1.Final. Thanks to Gary Gregory.
o            Bump commons-pool2 from 2.9.0 to 2.10.0. Thanks to Gary Gregory.
o            Bump checkstyle to 8.44. Thanks to Gary Gregory.
o            Bump spotbugs from 4.2.3 to 4.3.0 #117. Thanks to Dependabot.
o            Bump spotbugs-maven-plugin from 4.2.3 to 4.3.0 #118. Thanks to Dependabot.


For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download page: https://commons.apache.org/dbcp/download_dbcp.cgi

-----------------------------------------------------------------------------

              Apache Apache Commons DBCP
              Version 2.8.0
              RELEASE NOTES

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.8.0.

Apache Commons DBCP software implements Database Connection Pooling.

This is a minor release, including bug fixes and enhancements.

Changes in this version include:

New features:
o DBCP-564:  Fix BasicManagedDataSource leak of connections opened after transaction is rollback-only #39. Thanks to Florent Guillaume.
o DBCP-566:  Add clearStatementPoolOnReturn #42. Thanks to Robert Paschek, Gary Gregory, Phil Steitz.
o DBCP-559:  Add start, restart methods to BasicDataSource. #50. Thanks to Phil Steitz.

Fixed Bugs:
o DBCP-555:  NPE when creating a SQLExceptionList with a null list. Thanks to Gary Gregory.
o DBCP-558:  Fix DelegatingConnection readOnly and autoCommit caching mechanism #35. Thanks to louislatreille.
o            Fix regression introduced by unreleased code clean-up #63. Thanks to Sebastian Haas.

Changes:
o            Update to PR#36 - PrepareStatement and prepareCall methods are extracted #37. Thanks to DoiMasayuki, Alexander Norz, Gary Gregory.
o            Mask out user name and password from DriverAdapterCPDS.toString(). Thanks to Gary Gregory.
o DBCP-650:  Update Apache Commons Pool from 2.7.0 to 2.8.1, #48. Thanks to Gary Gregory, Dependabot.
o            Update tests from H2 1.4.199 to 1.4.200. Thanks to Gary Gregory.
o            Update tests from Mockito 3.0.0 to 3.5.11 #47, #60, #64. Thanks to Gary Gregory, Dependabot.
o            Update tests from jboss-logging 3.4.0.Final to 3.4.1.Final. Thanks to Gary Gregory.
o            Update tests from narayana-jta 5.9.5.Final to 5.10.6.Final, #61. Thanks to Gary Gregory.
o            Update tests from junit-jupiter 5.5.1 to 5.7.0 #62. Thanks to Gary Gregory.
o            Update tests from org.slf4j:slf4j-simple 1.7.26 to 1.7.30. Thanks to Gary Gregory.
o            Update build from com.github.siom79.japicmp:japicmp-maven-plugin 0.13.1 to 0.14.3. Thanks to Gary Gregory.
o            Update build from maven-javadoc-plugin 3.1.1 to 3.2.0. Thanks to Gary Gregory.
o            Update build from maven-pmd-plugin 3.12.0 to 3.13.0. Thanks to Gary Gregory.
o            Update org.apache.commons:commons-parent from 48 to 51. Thanks to Gary Gregory.
o            Update jacoco-maven-plugin from 0.8.4 to 0.8.6. Thanks to Gary Gregory.
o            Update maven-checkstyle-plugin from 3.0.0 to 3.1.1. Thanks to Gary Gregory.
o            Update actions/checkout from v1 to v2.3.2, #44, #51. Thanks to Dependabot.
o            Update actions/setup-java from v1.4.0 to v1.4.2 #58. Thanks to Dependabot.


For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download page: https://commons.apache.org/dbcp/download_dbcp.cgi

-----------------------------------------------------------------------------

              Apache Apache Commons DBCP
              Version 2.7.0
              RELEASE NOTES
              7 July 2019

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.7.0.

Apache Commons DBCP software implements Database Connection Pooling.

This is a minor release, including bug fixes and enhancements.

Changes in this version include:

New features:
o DBCP-539:  ManagedDataSource#close() should declare used exceptions. Thanks to Jacques Le Roux.
o DBCP-547:  Add a ConnectionFactory class name setting for BasicDataSource.createConnectionFactory() #33. Thanks to leechoongyon, Gary Gregory.
o            Add missing Javadocs. Thanks to Gary Gregory.

Fixed Bugs:
o DBCP-538:  Wrong JMX base name derived in BasicDataSource#updateJmxName. Thanks to Ragnar Haugan, Gary Gregory.
o DBCP-546:  Avoid NPE when calling DriverAdapterCPDS.toString(). Thanks to Sergey Chupov.
o DBCP-550:  java.util.IllegalFormatException while building a message for a SQLFeatureNotSupportedException in Jdbc41Bridge.getObject(ResultSet,String,Class). Thanks to Gary Gregory.
o            Fix Javadoc link in README.md #21. Thanks to LichKing-lee.

Changes:
o DBCP-540:  Close ObjectOutputStream before calling toByteArray() on underlying ByteArrayOutputStream #28. Thanks to emopers.
o DBCP-541:  Upgrade to JUnit Jupiter #19. Thanks to Allon Murienik.
o DBCP-542:  Fix tests on Java 11. Thanks to Zheng Feng, Gary Gregory.
o DBCP-543:  Update Apache Commons Pool from 2.6.1 to 2.6.2. Thanks to Gary Gregory.
o DBCP-529:  Add 'jmxName' property to web configuration parameters listing. Thanks to Yuri.
o DBCP-548:  Update Apache Commons Pool from 2.6.2 to 2.7.0. Thanks to Gary Gregory.
o DBCP-549:  Make org.apache.commons.dbcp2.AbandonedTrace.removeTrace(AbandonedTrace) null-safe. Thanks to Gary Gregory.
o DBCP-551:  org.apache.commons.dbcp2.DelegatingStatement.close() should try to close ALL of its result sets even when an exception occurs. Thanks to Gary Gregory.
o DBCP-552:  org.apache.commons.dbcp2.DelegatingConnection.passivate() should close ALL of its resources even when an exception occurs. Thanks to Gary Gregory.
o DBCP-553:  org.apache.commons.dbcp2.PoolablePreparedStatement.passivate() should close ALL of its resources even when an exception occurs. Thanks to Gary Gregory.
o DBCP-554:  org.apache.commons.dbcp2.PoolableCallableStatement.passivate() should close ALL of its resources even when an exception occurs. Thanks to Gary Gregory.
o            Update tests from org.mockito:mockito-core 2.28.2 to 3.0.0. Thanks to Gary Gregory.
o            Update tests from H2 1.4.198 to 1.4.199. Thanks to Gary Gregory.
o            Update tests from com.h2database:h2 1.4.197 to 1.4.199. Thanks to Gary Gregory.
o            Update tests from org.jboss.narayana.jta:narayana-jta 5.9.2.Final to 5.9.5.Final. Thanks to Gary Gregory.
o            Update tests from org.jboss.logging:jboss-logging 3.3.2.Final to 3.4.0.Final. Thanks to Gary Gregory.
o            Update tests from org.mockito:mockito-core 2.24.0 to 2.28.2. Thanks to Gary Gregory.
o            Update tests from org.mockito:mockito-core 2.28.2 to 3.0.0. Thanks to Gary Gregory.


For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download page: https://commons.apache.org/dbcp/download_dbcp.cgi

-----------------------------------------------------------------------------

              Apache Apache Commons DBCP
              Version 2.6.0
              RELEASE NOTES

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.6.0.

Apache Commons DBCP software implements Database Connection Pooling.

This is a minor release, including bug fixes and enhancements.

Changes in this version include:

New features:
o DBCP-534:  Allow for manual connection eviction. Thanks to Peter Wicks.
o DBCP-514:  Allow DBCP to register with a TransactionSynchronizationRegistry for XA cases. Thanks to Tom Jenkinson, Gary Gregory.
o DBCP-519:  Add some toString() methods for debugging (never printing passwords.) Thanks to Gary Gregory.
o DBCP-527:  Add getters to some classes. Thanks to Gary Gregory.
o DBCP-528:  org.apache.commons.dbcp2.DriverManagerConnectionFactory should use a char[] instead of a String to store passwords. Thanks to Gary Gregory.

Fixed Bugs:
o DBCP-518:  Allow DBCP to work with old Java 6/JDBC drivers without throwing AbstractMethodError. Thanks to Gary Gregory.

Changes:
o DBCP-517:  Make defensive copies of char[] passwords. Thanks to Gary Gregory.
o DBCP-515:  Do not try to register synchronization when the transaction is no longer active. Thanks to Tom Jenkinson, Gary Gregory.
o DBCP-516:  Do not double returnObject back to the pool if there is a transaction context with a shared connection. Thanks to Tom Jenkinson, Gary Gregory.
o DBCP-520:  BasicManagedDataSource needs to pass the TSR with creating DataSourceXAConnectionFactory. Thanks to Zheng Feng.
o DBCP-537:  Update Apache Commons Pool from 2.6.0 to 2.6.1. Thanks to Gary Gregory.


For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download page: https://commons.apache.org/dbcp/download_dbcp.cgi

-----------------------------------------------------------------------------

              Apache Apache Commons DBCP
              Version 2.5.0
              RELEASE NOTES

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.5.0.

Apache Commons DBCP software implements Database Connection Pooling.

This is a minor release, including bug fixes and enhancements and requires Java 8 to support JDBC 4.2.

Changes in this version include:

New features:
o DBCP-506:  Support JDBC 4.2. Thanks to Gary Gregory.
o DBCP-479:  Support default schema in configuration. Thanks to Guillaume Husta, Gary Gregory.

Fixed Bugs:
o DBCP-508:  Prepared statement keys should take a Connection's schema into account. Thanks to Gary Gregory.
o DBCP-512:  Avoid exceptions when closing a connection in mutli-threaded use case. Thanks to Gary Gregory.

Changes:
o DBCP-505:  Update Java requirement from version 7 to 8. Thanks to Gary Gregory.
o DBCP-427:  Examines 'SQLException's thrown by underlying connections or statements for fatal (disconnection) errors. Thanks to Vladimir Konkov, Phil Steitz, Gary Gregory.
o DBCP-507:  Change default for fail-fast connections from false to true. Thanks to Vladimir Konkov, Phil Steitz, Gary Gregory.
o DBCP-504:  Increase test coverage. Thanks to Bruno P. Kinoshita.
o DBCP-510:  Update Apache Commons Pool from 2.5.0 to 2.6.0. Thanks to Gary Gregory.

Note that Clirr incorrectly reports one binary incompatible change because it is not aware of Java 8 and default methods:
[ERROR] 7012: org.apache.commons.dbcp2.BasicDataSourceMXBean: Method 'public java.lang.String getDefaultSchema()' has been added to an interface

For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download from https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

-----------------------------------------------------------------------------

Download page: https://commons.apache.org/dbcp/download_dbcp.cgi

              Apache Apache Commons DBCP
              Version 2.4.0
              RELEASE NOTES

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.4.0.

Apache Commons DBCP software implements Database Connection Pooling.

This is a minor release, including bug fixes and enhancements, which you can download from https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

Changes in this version include:


Fixed Bugs:
o DBCP-484:  Connection leak during XATransaction in high load. Thanks to Emanuel Freitas.
o DBCP-496:  Add support for pooling CallableStatements to the org.apache.commons.dbcp2.cpdsadapter package. Thanks to Gary Gregory.

Changes:
o DBCP-492:  Drop Ant build. Thanks to Gary Gregory.
o DBCP-491:  Ensure DBCP ConnectionListener can deal with transaction managers which invoke rollback in a separate thread. Thanks to Zheng Feng, Gary Gregory.
o DBCP-494:  org.apache.commons.dbcp2.PStmtKey should make copies of given arrays in constructors. Thanks to Gary Gregory.
o DBCP-495:  Remove duplicate code in org.apache.commons.dbcp2.cpdsadapter.PStmtKeyCPDS. Thanks to Gary Gregory.
o DBCP-497:  Deprecate use of PStmtKeyCPDS in favor of PStmtKey. Thanks to Gary Gregory.
o DBCP-498:  org.apache.commons.dbcp2.DataSourceConnectionFactory should use a char[] instead of a String to store passwords. Thanks to Gary Gregory.
o DBCP-499:  org.apache.commons.dbcp2.managed.DataSourceXAConnectionFactory should use a char[] instead of a String to store passwords. Thanks to Gary Gregory.
o DBCP-500:  org.apache.commons.dbcp2.cpdsadapter.DriverAdapterCPDS should use a char[] instead of a String to store passwords. Thanks to Gary Gregory.
o DBCP-501:  org.apache.commons.dbcp2.datasources.CPDSConnectionFactory should use a char[] instead of a String to store passwords. Thanks to Gary Gregory.
o DBCP-502:  org.apache.commons.dbcp2.datasources internals should use a char[] instead of a String to store passwords. Thanks to Gary Gregory.
o DBCP-503:  org.apache.commons.dbcp2.datasources.InstanceKeyDataSourceFactory.closeAll() does not close all. Thanks to Gary Gregory.


For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download from https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

-----------------------------------------------------------------------------

              Apache Apache Commons DBCP
              Version 2.3.0
              RELEASE NOTES

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.3.0.

Apache Commons DBCP software implements Database Connection Pooling.

This is a minor release, including bug fixes and enhancements.

Changes in this version include:

Fixed Bugs:
o DBCP-476:  AbandonedTrace.getTrace() contains race condition Thanks to Gary Evesson, Richard Cordova.
o DBCP-482:  Avoid javax.management.InstanceNotFoundException on shutdown when a bean is not registered. Thanks to Dennis Lloyd, Gary Gregory.

Changes:
o DBCP-483:  Make constant public: org.apache.commons.dbcp2.PoolingDriver.URL_PREFIX. Thanks to Gary Gregory.
o DBCP-486:  DriverAdapterCPDS.setUser(), setPassword(), and getPooledConnection() with null arguments throw NullPointerExceptions when connection properties are set. Thanks to Gary Gregory.
o DBCP-487:  Add API org.apache.commons.dbcp2.datasources.PerUserPoolDataSource.clear(). Thanks to Gary Gregory.
o DBCP-488:  NPE for org.apache.commons.dbcp2.cpdsadapter.DriverAdapterCPDS.setConnectionProperties(null). Thanks to Gary Gregory.
o DBCP-490:  The method org.apache.commons.dbcp2.PoolingDriver.getConnectionPool(String) does not tell you which pool name is not registered when it throws an exception. Thanks to Gary Gregory.


For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download from https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

-----------------------------------------------------------------------------

              Apache Apache Commons DBCP
              Version 2.2.0
              RELEASE NOTES

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.2.0.

Apache Commons DBCP software implements Database Connection Pooling.

This is a minor release, including bug fixes and enhancements.

Changes in this version include:

New features:
o DBCP-451:  Add constructor DriverManagerConnectionFactory(String).
o DBCP-462:  Refactoring to prepare for a future patch to enable pooling of all
             prepared and callable statements in PoolingConnection. Thanks to Keiichi Fujino.
o DBCP-458:  Make it simpler to extend BasicDataSource to allow sub-classes to
             provide custom GenericObjectPool implementations. Thanks to Adrian Tarau.
o DBCP-474:  Enable pooling of all prepared and callable statements
             inPoolingConnection. Thanks to Keiichi Fujino.

Fixed Bugs:
o DBCP-481:  Update Apache Commons Pool from 2.4.2 to 2.5.0. Thanks to Gary Gregory.
o DBCP-454:  OSGi declarations contain multiple import headers for javax.transaction. Thanks to Philipp Marx, Matt Sicker.
o DBCP-478:  Wrong parameter name in site documentation for BasicDataSource Configuration Parameters. Thanks to nicola mele.
o DBCP-452:  Add jmxName to properties set by BasicDataSourceFactory.  This
             enables container-managed pools created from JNDI Resource
             definitions to enable JMX by supplying a valid root JMX name.
o DBCP-446:  NullPointerException thrown when calling ManagedConnection.isClosed(). Thanks to Gary Gregory, feng yang, Euclides M, Phil Steitz.
o DBCP-444:  InvalidateConnection can result in closed connection returned by getConnection.
o DBCP-449:  Complete the fix for DBCP-418, enabling PoolableConnection class to load in environments
             (such as GAE) where the JMX ManagementFactory is not available. Thanks to Grzegorz D..
o DBCP-455:  Ensure that the cacheState setting is used when statement pooling is
             disabled. Thanks to Kyohei Nakamura.
o DBCP-453:  Ensure that setSoftMinEvictableIdleTimeMillis is used when working with
             BasicDataSource. Thanks to Philipp Marx.
o DBCP-456:  Correct the name of the configuration attribute
             softMinEvictableIdleTimeMillis. Thanks to Kyohei Nakamura.
o DBCP-472:  Avoid potential infinite loops when checking if an SQLException is fatal
             for a connection or not.
o DBCP-468:  Expand the fail-fast for fatal connection errors feature to include
             managed connections.
o DBCP-463:  Correct a typo in the method name
             PoolableConnectionFactory#setMaxOpenPreparedStatements. The old method
             remains but is deprecated so not to break clients currently using the
             incorrect name.
o DBCP-459:  Ensure that a thread's interrupt status is visible to the caller if the
             thread is interrupted during a call to
             PoolingDataSource.getConnection().
o DBCP-457:  When using a BasicDataSource, pass changes related to the handling of
             abandoned connections to the underlying pool so that the pool
             configuration may be updated dynamically.



For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download from https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

-----------------------------------------------------------------------------

              Apache Apache Commons DBCP
              Version 2.1.1
              RELEASE NOTES

The Apache Commons DBCP team is pleased to announce the release of Apache Apache Commons DBCP 2.1.1.

Apache Commons DBCP software implements Database Connection Pooling.

This is a patch release, including bug fixes only.

Changes in this version include:

Fixed Bugs:
o DBCP-441:  Added BasicDataSource abandonedUsageTracking property missing from BasicDataSourceFactory.
o DBCP-442:  SharedPoolDataSource getConnection fails when testOnBorrow is set with
             a null validation query.
o DBCP-438:  Nested connections in a transaction (local) throws null pointer. Thanks to Raihan Kibria.
o DBCP-437:  BasicDataSource does not set disconnectionSql properties on its PoolableConnectionFactory.

Changes:
o            Updated pool version to 2.4.2.  The fix for POOL-300 may cause DBCP
             users to see more reports of abandoned connections (if removal and logging
             are configured).  Prior to the fix for POOL-300, the PrintWriter used to log
             abandoned connection stack traces was not being flushed on each log event.


For complete information on Apache Commons DBCP, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons DBCP website:

https://commons.apache.org/dbcp/

Download from https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
