              Apache Commons Pool 2.3 RELEASE NOTES

The Apache Commons Pool team is pleased to announce the release of Apache Commons Pool 2.3.

Apache Commons Pool provides an object-pooling API and a number of object pool implementations.
Version 2 contains a completely re-written pooling implementation compared to the 1.x series.
In addition to performance and scalability improvements, version 2 includes robust instance
tracking and pool monitoring. Version 2 requires JDK level 1.6 or above. 

No client code changes are required to migrate from version 2.0, 2.1, or 2.2 to 2.3.
Users of version 1.x should consult the migration guide on the Commons Pool web site.

NOTE: The MBean interfaces (DefaultPooledObjectInfoMBean, GenericKeyedObjectPoolMXBean
      and GenericKeyedObjectPoolMXBean) exist only to define the attributes and methods
      that will be made available via JMX. They must not be implemented by clients as
      they are subject to change between major, minor and patch version releases of
      Commons Pool. Clients that implement any of these interfaces may not, therefore,
      be able to upgrade to a new minor or patch release without requiring code
      changes.

This is a maintenance release that includes bug fixes and minor enhancements.

Changes in version 2.3 include:

New features:
o POOL-262:  Made fairness configurable for GenericObjectPool, GenericKeyedObjectPool.

Fixed Bugs:
o POOL-279:  Eliminated possibility that DefaultPoolObject#getIdleTimeMillis() could
             return a negative value. Use by pool implementations would not hit this
             bug. Thanks to Jacopo Cappellato.
o POOL-275:  Made wrapped BaseProxyHandler.pooledObject volatile.
o POOL-277:  Replace synchronisation with lock-free maxBorrowWaitTimeMillis to
             increase scalability. Thanks to Lucas Pouzac.
o POOL-276:  Ensure that objects are not validated on borrow when testOnBorrow is set
             to false, testOnCreate is set to true and the pool is exhausted at the
             point borrowObject() is called.
o POOL-270:  Fixed error in GenericKeyedObjectPool constructor causing minEvictableIdleTimeMillis
             to be used in place of timeBetweenEvictionRunsMillis in eviction timer setup
             when a GenericKeyedObjectPoolConfig instance is supplied to the constructor. Thanks to Michael Berman.
o POOL-263:  Fix a threading issue that meant that concurrent calls to close() and
             returnObject() could result in some returned objects not being destroyed.
o POOL-261:  Correctly mark cglib as an optional dependency and ensure that the OSGi
             manifest information reflects that.
o            Improve performance of statistics collection for pools that extend
             BaseGenericObjectPool.
o POOL-259:  Made client wait time statistics accurate when pools are configured to
             block indefinitely.  Also modified computation to include latency clients
             experience due to waiting on factory methods.
o            Prevent potential memory leaks when the Pool is dereferenced without being
             closed.
o            Prevent potential memory leaks with using an Evictor in a container
             environment.
o            Protect against a user provided eviction policy throwing an exception and
             stopping the Evictor thread.
o            Use the thread context class loader to load custom eviction policies. This
             allows application provided eviction policies to be used in a container
             environment when the pooling implementation is provided by the container.
o POOL-281:  Fix a potential infinite loop in the underlying Deque implementation.

Changes:
o POOL-273:  Update cglib to 3.1 from 3.0.
o POOL-274:  Update asm-util to 5.0.3 from 4.0.


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

http://commons.apache.org/proper/commons-pool/


