blob: 46135324b8157b731989e4e5f56148bebf210569 [file] [log] [blame]
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
<properties>
<title>Commons Pool Changes</title>
<author email="sandymac@apache.org">Sandy McArthur</author>
</properties>
<body>
<release version="1.5.1" date="2009-06-16" description=
"This is a patch release containing a fix for POOL-144, a regression introduced
in version 1.5.">
<action dev="markt" type="fix" issue="POOL-144">
When exhausted action is set to WHEN_EXHAUSTED_BLOCK, maxwait is positive and
client threads time out waiting for idle objects, capacity can be "leaked"
from GenericObjectPools and GeneritCkeyedObjectPools.
</action>
</release>
<release version="1.5" date="2009-06-10" description=
"This is a maintenance release including several important bug fixes. This release
is source and binary compatible with versions 1.3 and 1.4 of commons pool. In addition
to resolving some important concurrency-related bugs (POOL-135, POOL-125, POOL-29
POOL-107) this release implements a fairness algorithm to ensure that threads waiting
for available object instances from GenericObjectPools and GenericKeyedObjectPools are served
in request arrival order.">
<action dev="markt" type="fix" issue="POOL-139" due-to="Sebastian Bazley">
StackKeyedObjectPool.getNumActive() needs to be synchronized.
</action>
<action dev="markt" type="fix" issue="POOL-137" due-to="Sebastian Bazley">
Inconsistent synchronization in GenericObjectPool; constant fields should be final.
</action>
<action dev="markt" type="fix" issue="POOL-75" due-to="Takayuki Kaneko and Gordon Mohr">
GenericObjectPool not FIFO with respect to borrowing threads.
</action>
<action dev="markt" type="fix" issue="POOL-135">
_numActive > _maxActive under load
</action>
<action dev="markt" type="fix" issue="POOL-125">
Insufficient control over concurrent access to pooled objects by Evictor, client threads.
</action>
<action dev="markt" type="fix" issue="POOL-107">
Number of connections created has crossed more than maxActive.
</action>
<action dev="markt" type="fix" issue="POOL-122">
java.util.Timer in EvictionTimer does not recover from OutOfMemoryError in Evictor.
</action>
<action dev="markt" type="fix" issue="POOL-133">
Failed object creation may result in invalid active count in GKOP.
</action>
</release>
<release version="1.4" date="2008-01-15" description=
"This is a maintenance release including numerous bug fixes. This release
is source and binary compatible with version 1.3 of commons pool, but
there are some behavior changes introduced to resolve bugs, remove ambiguity
or improve robustness. Among these are the change in default behavior of
GenericObjectPool and GenericKeyedObjectPool from FIFO back to LIFO queues
(as in 1.2 and earlier). The LIFO/FIFO behavior is now configurable. Some of
the extra synchronization included in version 1.3 was removed / refactored to
improve performance. The javadoc has also been made more complete and explicit.
See the detailed list of changes below for specifics on fixed bugs and behavior
changes in Commons Pool 1.4. This version of Commons Pool depends only on
JDK version 1.3 or higher. Classes implementing pools are all intended to be
threadsafe.">
<action dev="sandymac" type="fix">
Fixed constructor which was ignoring maxTotal parameter:
GenericKeyedObjectPool(KeyedPoolableObjectFactory factory, int maxActive, byte whenExhaustedAction,
long maxWait, int maxIdle, int maxTotal, boolean testOnBorrow, boolean testOnReturn,
long timeBetweenEvictionRunsMillis, int numTestsPerEvictionRun, long minEvictableIdleTimeMillis,
boolean testWhileIdle)
</action>
<action dev="sandymac" type="fix">
Changed StackKeyedObjectPool to discard stalest, not freshest, idle object when maxSleeping is reached.
</action>
<action dev="psteitz" type="fix" issue="POOL-102" due-to="John Sumsion">
Allowed blocked threads in GenericObjectPool borrowObject to be interrupted.
</action>
<action dev="psteitz" type="fix" issue="POOL-86">
Fixes to address idle object eviction and LIFO/FIFO behavior reported
in POOL-86. Made LIFO/FIFO behavior configurable for GenericObjectPool and
GenericKeyedObjectPool, with default set back to LIFO (reverting to 1.2 behavior).
Fixed GOP, GKOP evict method and added tests to ensure objects are visited in
oldest-to-youngest order. Changed backing store for GOP, GKOP pools back to Commons
Collections CursorableLinkedList (brought this class in, repackaged with package scope).
</action>
<action dev="psteitz" type="fix" issue="POOL-110" due-to="Alexander Pogrebnyak">
Changed the default setting for Config.softMinEvictableIdleTimeMillis to
GenericObjectPool.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS (was
being incorrectly defaulted to DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS).
</action>
<action dev="psteitz" type="fix" issue="POOL-97" due-to="Mark Thomas">
Added a wrapper for the shared idle object eviction timer for all
pools. The wrapper class wraps the Timer and keeps track of how many
pools are using it. If no pools are using the timer, it is canceled.
This prevents a thread being left running which, in application server
environments, can lead to memory leaks and/or prevent applications
from shutting down or reloading cleanly.
</action>
<action dev="psteitz" type="fix" issue="POOL-93"
due-to="Mark Thomas">
Reduced synchronization in GenericObjectPool, GenericKeyedObjectPool.
Factory method activations within synchronized blocks were causing
performance problems in DBCP and other applications where factory
methods could block. Fixes both POOL-93 and POOL-108.
</action>
<action dev="psteitz" type="fix" issue="POOL-113">
Made _testOnBorrow, _testOnReturn volatile and removed synchronization
in associated getters and setters in GenericObjectPool,
GenericKeyedObjectPool. Made getNumIdle synchronized in
StackKeyedObjectPool.
</action>
<action dev="psteitz" type="fix" issue="POOL-116">
Fixed an error in the GenericKeyedObjectPool constructor that takes
a Config instance as a parameter. The minIdle setting in the Config
was being ignored by the constructor.
</action>
<action def="psteitz" type="fix" issue="POOL-117">
Made behavior on instance validation failure consistent across pools,
eliminating possible infinite loops in StackObjectPool,
StackKeyedObjectPool, SoftReferenceObjectPool when factory fails to
create valid objects.
</action>
<action dev="sandymac" type="update">
When no factory has been defined, addObject now throws
IllegalStateExecption instead of NullPointerException for all pools.
</action>
<action dev="sandymac" type="update">
SoftReferenceObjectPool. Improved the accuracy of getNumIdle by
"pruning" references to objects that have been garbage collected.
</action>
<action dev="sandymac" type="update">
GenericObjectPool, GenericKeyedObjectPool, SoftReferenceObjectPool,
StackObjectPool. Eliminated IllegalStateExceptions when the following
operations are attempted on a closed pool: getNumActive, getNumIdle,
returnObject, invalidateObject. In each case, the operation is allowed
to proceed, reporting the state of the pool that is being shut down, or
destroying objects returning to the closed pool.
</action>
<action dev="sandymac" type="update">
StackObjectPool, SoftReferenceObjectPool, GenericKeyedObjectPool. Allowed
borrowObject to continue (either examining additional idle instances or
with makeObject) when an exception is encountered activating an idle
object instead of propagating the exception to the client. Also made
addObject propagate (not swallow) exceptions when passivating newly
created instances.
</action>
<action dev="psteitz" type="update">
StackKeyedObjectPool. Added validation check for objects returned
from borrowObject.
</action>
<action dev="sandymac" type="update">
BaseObjectPool, BaseKeyedObjectPool. Instead of throwing
UnsupportedOperationException, the base class implementations
of getNumIdle and getNumActive return negative values. The
base implementation of close in BaseObjectPool no longer throws
IllegalStateException when invoked on an already closed pool.
</action>
</release>
<release version="1.3" date="2006-04-06" description="1.x bugfix release">
<action type="fix">A large number of bug fixes. See release notes for changes.</action>
</release>
<release version="1.2" date="2004-06-07" description="bugfixes">
<action dev="dirkv" type="fix">
GenericKeyedObjectPoolFactory Config Constructor is incorrect
</action>
<action dev="dirkv" type="fix">
Not possible to extend GenericObjectPool.returnObject() without affecting addObject()
</action>
</release>
<release version="1.1" date="2003-10-20" description="bugfixes">
<action type="fix">A lot of corner cases were fixed</action>
<action type="fix">Performance improvement by optimizing pool synchronization, the critical code paths were optimized by reducing pool synchronization but we also added more synchronization where needed</action>
<action type="fix">New minIdle feature: the minimum number of objects allowed in the pool before the evictor thread (if active) spawns new objects. (Note no objects are created when: numActive + numIdle >= maxActive)</action>
<action type="fix">New maxTotal feature: a cap on the total number of instances controlled by a pool. Only for GenericKeyedObjectPool where maxActive is a cap on the number of active instances from the pool (per key).</action>
<action type="fix">UML Class and sequence diagrams</action>
<action type="fix">See bugzilla for more changes</action>
</release>
<release version="1.0.1" date="2002-08-12">
<action type="fix">No change log available.</action>
</release>
<release version="1.0" date="2002-05-04">
<action type="add">No change log available.</action>
</release>
</body>
</document>