org.apache.tomcat.dbcp.pool2.ObjectPool Maven / Gradle / Ivy
/*
* 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.
*/
package org.apache.tomcat.dbcp.pool2;
import java.io.Closeable;
import java.util.NoSuchElementException;
/**
* A pooling simple interface.
*
* Example of use:
*
* Object obj = null
;
*
* try
{
* obj = pool.borrowObject();
* try
{
* //...use the object...
* } catch
(Exception e) {
* // invalidate the object
* pool.invalidateObject(obj);
* // do not return the object to the pool twice
* obj = null
;
* } finally
{
* // make sure the object is returned to the pool
* if
(null
!= obj) {
* pool.returnObject(obj);
* }
* }
* } catch
(Exception e) {
* // failed to borrow an object
* }
*
* See {@link BaseObjectPool} for a simple base implementation.
*
*
* @param Type of element pooled in this pool.
*
* @see PooledObjectFactory
* @see KeyedObjectPool
* @see BaseObjectPool
*
* @since 2.0
*/
public interface ObjectPool extends Closeable {
/**
* Creates an object using the {@link PooledObjectFactory factory} or other
* implementation dependent mechanism, passivate it, and then place it in
* the idle object pool. {@code addObject} is useful for "pre-loading"
* a pool with idle objects. (Optional operation).
*
* @throws Exception
* when {@link PooledObjectFactory#makeObject} fails.
* @throws IllegalStateException
* after {@link #close} has been called on this pool.
* @throws UnsupportedOperationException
* when this pool cannot add new idle objects.
*/
void addObject() throws Exception;
/**
* Calls {@link ObjectPool#addObject()} {@code count}
* number of times.
*
* @param count
* the number of idle objects to add.
* @throws Exception See {@link ObjectPool#addObject()}.
* @since 2.8.0
*/
default void addObjects(final int count) throws Exception {
for (int i = 0; i < count; i++) {
addObject();
}
}
/**
* Borrows an instance from this pool.
*
* Instances returned from this method will have been either newly created
* with {@link PooledObjectFactory#makeObject} or will be a previously
* idle object and have been activated with
* {@link PooledObjectFactory#activateObject} and then validated with
* {@link PooledObjectFactory#validateObject}.
*
*
* By contract, clients must return the borrowed instance
* using {@link #returnObject}, {@link #invalidateObject}, 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).
*
*
* @return an instance from this pool.
*
* @throws IllegalStateException
* after {@link #close close} has been called on this pool.
* @throws Exception
* when {@link PooledObjectFactory#makeObject} throws an
* exception.
* @throws NoSuchElementException
* when the pool is exhausted and cannot or will not return
* another instance.
*/
T borrowObject() throws Exception;
/**
* Clears any objects sitting idle in the pool, releasing any associated
* resources (optional operation). Idle objects cleared must be
* {@link PooledObjectFactory#destroyObject(PooledObject)}.
*
* @throws UnsupportedOperationException
* if this implementation does not support the operation
*
* @throws Exception if the pool cannot be cleared
*/
void clear() throws Exception;
/**
* Closes this pool, and free any resources associated with it.
*
* Calling {@link #addObject} or {@link #borrowObject} after invoking this
* method on a pool will cause them to throw an {@link IllegalStateException}.
*
*
* Implementations should silently fail if not all resources can be freed.
*
*/
@Override
void close();
/**
* Gets the number of instances currently borrowed from this pool. Returns
* a negative value if this information is not available.
* @return the number of instances currently borrowed from this pool.
*/
int getNumActive();
/**
* Gets the number of instances currently idle in this pool. This may be
* considered an approximation of the number of objects that can be
* {@link #borrowObject borrowed} without creating any new instances.
* Returns a negative value if this information is not available.
* @return the number of instances currently idle in this pool.
*/
int getNumIdle();
/**
* Invalidates an object from the pool.
*
* By contract, {@code obj} must have been obtained
* using {@link #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.
*
*
* @param obj a {@link #borrowObject borrowed} instance to be disposed.
*
* @throws Exception if the instance cannot be invalidated
*/
void invalidateObject(T obj) throws Exception;
/**
* Invalidates an object from the pool, using the provided
* {@link DestroyMode}
*
* By contract, {@code obj} must have been obtained
* using {@link #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.
*
*
* @param obj a {@link #borrowObject borrowed} instance to be disposed.
* @param destroyMode destroy activation context provided to the factory
* @throws Exception if the instance cannot be invalidated
* @since 2.9.0
*/
default void invalidateObject(final T obj, final DestroyMode destroyMode) throws Exception {
invalidateObject(obj);
}
/**
* Returns an instance to the pool. By contract, {@code obj}
* must have been obtained using {@link #borrowObject()} or
* a related method as defined in an implementation or sub-interface.
*
* @param obj a {@link #borrowObject borrowed} instance to be returned.
*
* @throws IllegalStateException
* if an attempt is made to return an object to the pool that
* is in any state other than allocated (i.e. borrowed).
* Attempting to return an object more than once or attempting
* to return an object that was never borrowed from the pool
* will trigger this exception.
*
* @throws Exception if an instance cannot be returned to the pool
*/
void returnObject(T obj) throws Exception;
}