Class GenericObjectPool<T>
- java.lang.Object
-
- org.apache.tomcat.dbcp.pool2.BaseObject
-
- org.apache.tomcat.dbcp.pool2.impl.BaseGenericObjectPool<T>
-
- org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool<T>
-
- Type Parameters:
T- Type of element pooled in this pool.
- All Implemented Interfaces:
Closeable,AutoCloseable,GenericObjectPoolMXBean,ObjectPool<T>,UsageTracking<T>
public class GenericObjectPool<T> extends BaseGenericObjectPool<T> implements ObjectPool<T>, GenericObjectPoolMXBean, UsageTracking<T>
A configurableObjectPoolimplementation.When coupled with the appropriate
PooledObjectFactory,GenericObjectPoolprovides robust pooling functionality for arbitrary objects.Optionally, one may configure the pool to examine and possibly evict objects as they sit idle in the pool and to ensure that a minimum number of idle objects are available. This is performed by an "idle object eviction" thread, which runs asynchronously. Caution should be used when configuring this optional feature. Eviction runs contend with client threads for access to objects in the pool, so if they run too frequently performance issues may result.
The pool can also be configured to detect and remove "abandoned" objects, i.e. objects that have been checked out of the pool but neither used nor returned before the configured
removeAbandonedTimeout. Abandoned object removal can be configured to happen whenborrowObjectis invoked and the pool is close to starvation, or it can be executed by the idle object evictor, or both. If pooled objects implement theTrackedUseinterface, their last use will be queried using thegetLastUsedmethod on that interface; otherwise abandonment is determined by how long an object has been checked out from the pool.Implementation note: To prevent possible deadlocks, care has been taken to ensure that no call to a factory method will occur within a synchronization block. See POOL-125 and DBCP-44 for more information.
This class is intended to be thread-safe.
- Since:
- 2.0
- See Also:
GenericKeyedObjectPool
-
-
Field Summary
-
Fields inherited from class org.apache.tomcat.dbcp.pool2.impl.BaseGenericObjectPool
MEAN_TIMING_STATS_CACHE_SIZE
-
-
Constructor Summary
Constructors Constructor Description GenericObjectPool(PooledObjectFactory<T> factory)Creates a newGenericObjectPoolusing defaults fromGenericObjectPoolConfig.GenericObjectPool(PooledObjectFactory<T> factory, GenericObjectPoolConfig<T> config)Creates a newGenericObjectPoolusing a specific configuration.GenericObjectPool(PooledObjectFactory<T> factory, GenericObjectPoolConfig<T> config, AbandonedConfig abandonedConfig)Creates a newGenericObjectPoolthat tracks and destroys objects that are checked out, but never returned to the pool.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddObject()Creates an object, and place it into the pool. addObject() is useful for "pre-loading" a pool with idle objects.voidaddObjects(int count)CallsObjectPool.addObject()countnumber of times.TborrowObject()Equivalent to.borrowObject(BaseGenericObjectPool.getMaxWaitMillis())TborrowObject(long borrowMaxWaitMillis)Borrows an object from the pool using the specific waiting time which only applies ifBaseGenericObjectPool.getBlockWhenExhausted()is true.voidclear()Clears any objects sitting idle in the pool by removing them from the idle instance pool and then invoking the configuredPooledObjectFactory.destroyObject(PooledObject)method on each idle instance.voidclose()Closes the pool.voidevict()PerformnumTestsidle object eviction tests, evicting examined objects that meet the criteria for eviction.PooledObjectFactory<T>getFactory()Obtains a reference to the factory used to create, destroy and validate the objects used by this pool.StringgetFactoryType()Returns the type - including the specific type rather than the generic - of the factory.booleangetLogAbandoned()Gets whether this pool identifies and logs any abandoned objects.intgetMaxIdle()Returns the cap on the number of "idle" instances in the pool.intgetMinIdle()Returns the target for the minimum number of idle objects to maintain in the pool.intgetNumActive()Returns the number of instances currently borrowed from this pool.intgetNumIdle()The number of instances currently idle in this pool.intgetNumWaiters()Returns an estimate of the number of threads currently blocked waiting for an object from the pool.booleangetRemoveAbandonedOnBorrow()Gets whether a check is made for abandoned objects when an object is borrowed from this pool.booleangetRemoveAbandonedOnMaintenance()Gets whether a check is made for abandoned objects when the evictor runs.intgetRemoveAbandonedTimeout()Obtains the timeout before which an object will be considered to be abandoned by this pool.voidinvalidateObject(T obj)Invalidates an object from the pool.voidinvalidateObject(T obj, DestroyMode mode)Invalidates an object from the pool, using the providedDestroyModebooleanisAbandonedConfig()Gets whether or not abandoned object removal is configured for this pool.Set<DefaultPooledObjectInfo>listAllObjects()Provides information on all the objects in the pool, both idle (waiting to be borrowed) and active (currently borrowed).voidpreparePool()Tries to ensure thatgetMinIdle()idle instances are available in the pool.voidreturnObject(T obj)Returns an instance to the pool.voidsetAbandonedConfig(AbandonedConfig abandonedConfig)Sets the abandoned object removal configuration.voidsetConfig(GenericObjectPoolConfig<T> conf)Sets the base pool configuration.voidsetMaxIdle(int maxIdle)Returns the cap on the number of "idle" instances in the pool.voidsetMinIdle(int minIdle)Sets the target for the minimum number of idle objects to maintain in the pool.protected voidtoStringAppendFields(StringBuilder builder)Used by sub-classes to include the fields defined by the sub-class in theBaseObject.toString()output.voiduse(T pooledObject)This method is called every time a pooled object is used to enable the pool to better track borrowed objects.-
Methods inherited from class org.apache.tomcat.dbcp.pool2.impl.BaseGenericObjectPool
getBlockWhenExhausted, getBorrowedCount, getCreatedCount, getCreationStackTrace, getDestroyedByBorrowValidationCount, getDestroyedByEvictorCount, getDestroyedCount, getEvictionPolicy, getEvictionPolicyClassName, getEvictorShutdownTimeoutMillis, getFairness, getJmxName, getLifo, getMaxBorrowWaitTimeMillis, getMaxTotal, getMaxWaitMillis, getMeanActiveTimeMillis, getMeanBorrowWaitTimeMillis, getMeanIdleTimeMillis, getMinEvictableIdleTimeMillis, getNumTestsPerEvictionRun, getReturnedCount, getSoftMinEvictableIdleTimeMillis, getSwallowedExceptionListener, getTestOnBorrow, getTestOnCreate, getTestOnReturn, getTestWhileIdle, getTimeBetweenEvictionRunsMillis, isClosed, markReturningState, setBlockWhenExhausted, setConfig, setEvictionPolicy, setEvictionPolicyClassName, setEvictionPolicyClassName, setEvictorShutdownTimeoutMillis, setLifo, setMaxTotal, setMaxWaitMillis, setMinEvictableIdleTimeMillis, setNumTestsPerEvictionRun, setSoftMinEvictableIdleTimeMillis, setSwallowedExceptionListener, setTestOnBorrow, setTestOnCreate, setTestOnReturn, setTestWhileIdle, setTimeBetweenEvictionRunsMillis
-
Methods inherited from class org.apache.tomcat.dbcp.pool2.BaseObject
toString
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.apache.tomcat.dbcp.pool2.impl.GenericObjectPoolMXBean
getBlockWhenExhausted, getBorrowedCount, getCreatedCount, getCreationStackTrace, getDestroyedByBorrowValidationCount, getDestroyedByEvictorCount, getDestroyedCount, getFairness, getLifo, getMaxBorrowWaitTimeMillis, getMaxTotal, getMaxWaitMillis, getMeanActiveTimeMillis, getMeanBorrowWaitTimeMillis, getMeanIdleTimeMillis, getMinEvictableIdleTimeMillis, getNumTestsPerEvictionRun, getReturnedCount, getTestOnBorrow, getTestOnCreate, getTestOnReturn, getTestWhileIdle, getTimeBetweenEvictionRunsMillis, isClosed
-
-
-
-
Constructor Detail
-
GenericObjectPool
public GenericObjectPool(PooledObjectFactory<T> factory)
Creates a newGenericObjectPoolusing defaults fromGenericObjectPoolConfig.- Parameters:
factory- The object factory to be used to create object instances used by this pool
-
GenericObjectPool
public GenericObjectPool(PooledObjectFactory<T> factory, GenericObjectPoolConfig<T> config)
Creates a newGenericObjectPoolusing a specific configuration.- Parameters:
factory- The object factory to be used to create object instances used by this poolconfig- The configuration to use for this pool instance. The configuration is used by value. Subsequent changes to the configuration object will not be reflected in the pool.
-
GenericObjectPool
public GenericObjectPool(PooledObjectFactory<T> factory, GenericObjectPoolConfig<T> config, AbandonedConfig abandonedConfig)
Creates a newGenericObjectPoolthat tracks and destroys objects that are checked out, but never returned to the pool.- Parameters:
factory- The object factory to be used to create object instances used by this poolconfig- The base pool configuration to use for this pool instance. The configuration is used by value. Subsequent changes to the configuration object will not be reflected in the pool.abandonedConfig- Configuration for abandoned object identification and removal. The configuration is used by value.
-
-
Method Detail
-
getMaxIdle
public int getMaxIdle()
Returns the cap on the number of "idle" instances in the pool. If maxIdle is set too low on heavily loaded systems it is possible you will see objects being destroyed and almost immediately new objects being created. This is a result of the active threads momentarily returning objects faster than they are requesting them, causing the number of idle objects to rise above maxIdle. The best value for maxIdle for heavily loaded system will vary but the default is a good starting point.- Specified by:
getMaxIdlein interfaceGenericObjectPoolMXBean- Returns:
- the maximum number of "idle" instances that can be held in the pool or a negative value if there is no limit
- See Also:
setMaxIdle(int)
-
setMaxIdle
public void setMaxIdle(int maxIdle)
Returns the cap on the number of "idle" instances in the pool. If maxIdle is set too low on heavily loaded systems it is possible you will see objects being destroyed and almost immediately new objects being created. This is a result of the active threads momentarily returning objects faster than they are requesting them, causing the number of idle objects to rise above maxIdle. The best value for maxIdle for heavily loaded system will vary but the default is a good starting point.- Parameters:
maxIdle- The cap on the number of "idle" instances in the pool. Use a negative value to indicate an unlimited number of idle instances- See Also:
getMaxIdle()
-
setMinIdle
public void setMinIdle(int minIdle)
Sets the target for the minimum number of idle objects to maintain in the pool. This setting only has an effect if it is positive andBaseGenericObjectPool.getTimeBetweenEvictionRunsMillis()is greater than zero. If this is the case, an attempt is made to ensure that the pool has the required minimum number of instances during idle object eviction runs.If the configured value of minIdle is greater than the configured value for maxIdle then the value of maxIdle will be used instead.
- Parameters:
minIdle- The minimum number of objects.- See Also:
getMinIdle(),getMaxIdle(),BaseGenericObjectPool.getTimeBetweenEvictionRunsMillis()
-
getMinIdle
public int getMinIdle()
Returns the target for the minimum number of idle objects to maintain in the pool. This setting only has an effect if it is positive andBaseGenericObjectPool.getTimeBetweenEvictionRunsMillis()is greater than zero. If this is the case, an attempt is made to ensure that the pool has the required minimum number of instances during idle object eviction runs.If the configured value of minIdle is greater than the configured value for maxIdle then the value of maxIdle will be used instead.
- Specified by:
getMinIdlein interfaceGenericObjectPoolMXBean- Returns:
- The minimum number of objects.
- See Also:
setMinIdle(int),setMaxIdle(int),BaseGenericObjectPool.setTimeBetweenEvictionRunsMillis(long)
-
isAbandonedConfig
public boolean isAbandonedConfig()
Gets whether or not abandoned object removal is configured for this pool.- Specified by:
isAbandonedConfigin interfaceGenericObjectPoolMXBean- Returns:
- true if this pool is configured to detect and remove abandoned objects
-
getLogAbandoned
public boolean getLogAbandoned()
Gets whether this pool identifies and logs any abandoned objects.- Specified by:
getLogAbandonedin interfaceGenericObjectPoolMXBean- Returns:
trueif abandoned object removal is configured for this pool and removal events are to be logged otherwisefalse- See Also:
AbandonedConfig.getLogAbandoned()
-
getRemoveAbandonedOnBorrow
public boolean getRemoveAbandonedOnBorrow()
Gets whether a check is made for abandoned objects when an object is borrowed from this pool.- Specified by:
getRemoveAbandonedOnBorrowin interfaceGenericObjectPoolMXBean- Returns:
trueif abandoned object removal is configured to be activated by borrowObject otherwisefalse- See Also:
AbandonedConfig.getRemoveAbandonedOnBorrow()
-
getRemoveAbandonedOnMaintenance
public boolean getRemoveAbandonedOnMaintenance()
Gets whether a check is made for abandoned objects when the evictor runs.- Specified by:
getRemoveAbandonedOnMaintenancein interfaceGenericObjectPoolMXBean- Returns:
trueif abandoned object removal is configured to be activated when the evictor runs otherwisefalse- See Also:
AbandonedConfig.getRemoveAbandonedOnMaintenance()
-
getRemoveAbandonedTimeout
public int getRemoveAbandonedTimeout()
Obtains the timeout before which an object will be considered to be abandoned by this pool.- Specified by:
getRemoveAbandonedTimeoutin interfaceGenericObjectPoolMXBean- Returns:
- The abandoned object timeout in seconds if abandoned object removal is configured for this pool; Integer.MAX_VALUE otherwise.
- See Also:
AbandonedConfig.getRemoveAbandonedTimeout()
-
setConfig
public void setConfig(GenericObjectPoolConfig<T> conf)
Sets the base pool configuration.- Parameters:
conf- the new configuration to use. This is used by value.- See Also:
GenericObjectPoolConfig
-
setAbandonedConfig
public void setAbandonedConfig(AbandonedConfig abandonedConfig)
Sets the abandoned object removal configuration.- Parameters:
abandonedConfig- the new configuration to use. This is used by value.- See Also:
AbandonedConfig
-
getFactory
public PooledObjectFactory<T> getFactory()
Obtains a reference to the factory used to create, destroy and validate the objects used by this pool.- Returns:
- the factory
-
borrowObject
public T borrowObject() throws Exception
Equivalent to.borrowObject(BaseGenericObjectPool.getMaxWaitMillis())Obtains an instance from this pool.
Instances returned from this method will have been either newly created with
PooledObjectFactory.makeObject()or will be a previously idle object and have been activated withPooledObjectFactory.activateObject(org.apache.tomcat.dbcp.pool2.PooledObject<T>)and then validated withPooledObjectFactory.validateObject(org.apache.tomcat.dbcp.pool2.PooledObject<T>).By contract, clients must return the borrowed instance using
ObjectPool.returnObject(T),ObjectPool.invalidateObject(T), or a related method as defined in an implementation or sub-interface.The behavior of this method when the pool has been exhausted is not strictly specified (although it may be specified by implementations).
- Specified by:
borrowObjectin interfaceObjectPool<T>- Returns:
- an instance from this pool.
- Throws:
IllegalStateException- afterclosehas been called on this pool.Exception- whenPooledObjectFactory.makeObject()throws an exception.NoSuchElementException- when the pool is exhausted and cannot or will not return another instance.
-
borrowObject
public T borrowObject(long borrowMaxWaitMillis) throws Exception
Borrows an object from the pool using the specific waiting time which only applies ifBaseGenericObjectPool.getBlockWhenExhausted()is true.If there is one or more idle instance available in the pool, then an idle instance will be selected based on the value of
BaseGenericObjectPool.getLifo(), activated and returned. If activation fails, ortestOnBorrowis set totrueand validation fails, the instance is destroyed and the next available instance is examined. This continues until either a valid instance is returned or there are no more idle instances available.If there are no idle instances available in the pool, behavior depends on the
maxTotal, (if applicable)BaseGenericObjectPool.getBlockWhenExhausted()and the value passed in to theborrowMaxWaitMillisparameter. If the number of instances checked out from the pool is less thanmaxTotal,a new instance is created, activated and (if applicable) validated and returned to the caller. If validation fails, aNoSuchElementExceptionis thrown.If the pool is exhausted (no available idle instances and no capacity to create new ones), this method will either block (if
BaseGenericObjectPool.getBlockWhenExhausted()is true) or throw aNoSuchElementException(ifBaseGenericObjectPool.getBlockWhenExhausted()is false). The length of time that this method will block whenBaseGenericObjectPool.getBlockWhenExhausted()is true is determined by the value passed in to theborrowMaxWaitMillisparameter.When the pool is exhausted, multiple calling threads may be simultaneously blocked waiting for instances to become available. A "fairness" algorithm has been implemented to ensure that threads receive available instances in request arrival order.
- Parameters:
borrowMaxWaitMillis- The time to wait in milliseconds for an object to become available- Returns:
- object instance from the pool
- Throws:
NoSuchElementException- if an instance cannot be returnedException- if an object instance cannot be returned due to an error
-
returnObject
public void returnObject(T obj)
Returns an instance to the pool. By contract,objmust have been obtained usingObjectPool.borrowObject()or a related method as defined in an implementation or sub-interface.If
maxIdleis set to a positive value and the number of idle instances has reached this value, the returning instance is destroyed.If
testOnReturn== true, the returning instance is validated before being returned to the idle instance pool. In this case, if validation fails, the instance is destroyed.Exceptions encountered destroying objects for any reason are swallowed but notified via a
SwallowedExceptionListener.- Specified by:
returnObjectin interfaceObjectPool<T>- Parameters:
obj- aborrowedinstance to be returned.
-
invalidateObject
public void invalidateObject(T obj) throws Exception
Invalidates an object from the pool.By contract,
objmust have been obtained usingObjectPool.borrowObject()or a related method as defined in an implementation or sub-interface.This method should be used when an object that has been borrowed is determined (due to an exception or other problem) to be invalid.
Activation of this method decrements the active count and attempts to destroy the instance, using the default (NORMAL)
DestroyMode.- Specified by:
invalidateObjectin interfaceObjectPool<T>- Parameters:
obj- aborrowedinstance to be disposed.- Throws:
Exception- if an exception occurs destroying the objectIllegalStateException- if obj does not belong to this pool
-
invalidateObject
public void invalidateObject(T obj, DestroyMode mode) throws Exception
Invalidates an object from the pool, using the providedDestroyModeBy contract,
objmust have been obtained usingObjectPool.borrowObject()or a related method as defined in an implementation or sub-interface.This method should be used when an object that has been borrowed is determined (due to an exception or other problem) to be invalid.
Activation of this method decrements the active count and attempts to destroy the instance, using the provided
DestroyMode.- Specified by:
invalidateObjectin interfaceObjectPool<T>- Parameters:
obj- aborrowedinstance to be disposed.mode- destroy activation context provided to the factory- Throws:
Exception- if an exception occurs destroying the objectIllegalStateException- if obj does not belong to this pool- Since:
- 2.9.0
-
clear
public void clear()
Clears any objects sitting idle in the pool by removing them from the idle instance pool and then invoking the configuredPooledObjectFactory.destroyObject(PooledObject)method on each idle instance.Implementation notes:
- This method does not destroy or effect in any way instances that are checked out of the pool when it is invoked.
- Invoking this method does not prevent objects being returned to the idle instance pool, even during its execution. Additional instances may be returned while removed items are being destroyed.
- Exceptions encountered destroying idle instances are swallowed
but notified via a
SwallowedExceptionListener.
- Specified by:
clearin interfaceObjectPool<T>
-
getNumActive
public int getNumActive()
Description copied from interface:ObjectPoolReturns the number of instances currently borrowed from this pool. Returns a negative value if this information is not available.- Specified by:
getNumActivein interfaceGenericObjectPoolMXBean- Specified by:
getNumActivein interfaceObjectPool<T>- Returns:
- the number of instances currently borrowed from this pool.
-
getNumIdle
public int getNumIdle()
Description copied from class:BaseGenericObjectPoolThe number of instances currently idle in this pool.- Specified by:
getNumIdlein interfaceGenericObjectPoolMXBean- Specified by:
getNumIdlein interfaceObjectPool<T>- Specified by:
getNumIdlein classBaseGenericObjectPool<T>- Returns:
- count of instances available for checkout from the pool
-
close
public void close()
Closes the pool. Once the pool is closed,borrowObject()will fail with IllegalStateException, butreturnObject(Object)andinvalidateObject(Object)will continue to work, with returned objects destroyed on return.Destroys idle instances in the pool by invoking
clear().- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Specified by:
closein interfaceObjectPool<T>- Specified by:
closein classBaseGenericObjectPool<T>
-
evict
public void evict() throws ExceptionPerform
numTestsidle object eviction tests, evicting examined objects that meet the criteria for eviction. IftestWhileIdleis true, examined objects are validated when visited (and removed if invalid); otherwise only objects that have been idle for more thanminEvicableIdleTimeMillisare removed.Successive activations of this method examine objects in sequence, cycling through objects in oldest-to-youngest order.
- Specified by:
evictin classBaseGenericObjectPool<T>- Throws:
Exception- when there is a problem evicting idle objects.
-
preparePool
public void preparePool() throws ExceptionTries to ensure thatgetMinIdle()idle instances are available in the pool.- Throws:
Exception- If the associated factory throws an exception- Since:
- 2.4
-
addObject
public void addObject() throws ExceptionCreates an object, and place it into the pool. addObject() is useful for "pre-loading" a pool with idle objects.If there is no capacity available to add to the pool, this is a no-op (no exception, no impact to the pool).
- Specified by:
addObjectin interfaceObjectPool<T>- Throws:
Exception- whenPooledObjectFactory.makeObject()fails.IllegalStateException- afterObjectPool.close()has been called on this pool.UnsupportedOperationException- when this pool cannot add new idle objects.
-
addObjects
public void addObjects(int count) throws ExceptionCallsObjectPool.addObject()countnumber of times.- Specified by:
addObjectsin interfaceObjectPool<T>- Parameters:
count- the number of idle objects to add.- Throws:
Exception- whenObjectPool.addObject()fails.- Since:
- 2.8.0
-
use
public void use(T pooledObject)
Description copied from interface:UsageTrackingThis method is called every time a pooled object is used to enable the pool to better track borrowed objects.- Specified by:
usein interfaceUsageTracking<T>- Parameters:
pooledObject- The object that is being used
-
getNumWaiters
public int getNumWaiters()
Returns an estimate of the number of threads currently blocked waiting for an object from the pool. This is intended for monitoring only, not for synchronization control.- Specified by:
getNumWaitersin interfaceGenericObjectPoolMXBean- Returns:
- The estimate of the number of threads currently blocked waiting for an object from the pool
-
getFactoryType
public String getFactoryType()
Returns the type - including the specific type rather than the generic - of the factory.- Specified by:
getFactoryTypein interfaceGenericObjectPoolMXBean- Returns:
- A string representation of the factory type
-
listAllObjects
public Set<DefaultPooledObjectInfo> listAllObjects()
Provides information on all the objects in the pool, both idle (waiting to be borrowed) and active (currently borrowed).Note: This is named listAllObjects so it is presented as an operation via JMX. That means it won't be invoked unless the explicitly requested whereas all attributes will be automatically requested when viewing the attributes for an object in a tool like JConsole.
- Specified by:
listAllObjectsin interfaceGenericObjectPoolMXBean- Returns:
- Information grouped on all the objects in the pool
-
toStringAppendFields
protected void toStringAppendFields(StringBuilder builder)
Description copied from class:BaseObjectUsed by sub-classes to include the fields defined by the sub-class in theBaseObject.toString()output.- Overrides:
toStringAppendFieldsin classBaseGenericObjectPool<T>- Parameters:
builder- Field names and values are appended to this object
-
-