<?xml version="1.0"?>
<!--
   Copyright 2003-2004,2006 The Apache Software Foundation

   Licensed 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>Overview</title>
      <author email="commons-dev@jakarta.apache.org">Commons Documentation Team</author>
      <author email="rwaldhoff@apache.org">Rodney Waldhoff</author>
      <author email="sandymac@apache.org">Sandy McArthur</author>
      <revision>$Id$</revision>
   </properties>

   <body>
      <section name="The Pool Component">
         <p>
          Pool provides an Object-pooling API, with three major aspects:
          <ol>
           <li>
            A generic object pool interface that clients and implementors can use to provide easily 
            interchangable pooling implementations.
           </li>
           <li>
            A toolkit for creating modular object pools.
           </li>
           <li>
            Several general purpose pool implementations.
           </li>
          </ol>
         </p>
      </section>

      <section name="Releases">
         <p>
            See the <a href="downloads.html">downloads</a> page for information on obtaining releases.
            The <a href="release-notes-1.3.html">commons pool 1.3 release</a> is the most recent stable release. 
         </p>
      </section>

      <section name="Features">
        <p>
            The 
            <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/package-summary.html">org.apache.commons.pool</a> 
            package defines a handful of pooling interfaces and some base classes 
            that may be useful when creating new pool implementations.
        </p>
        <subsection name="ObjectPool">
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/ObjectPool.html"><code>ObjectPool</code></a>
             defines a trivially simple pooling interface:
          </p>
<source>
public interface ObjectPool {
    Object borrowObject();
    void returnObject(Object borrowed);
}
</source>           
          <p>
            Some client classes won't integrate with <i>Pool</i> any more than this.
            Clients written to this interface can use arbitrary <code>ObjectPool</code> 
            implementations interchangeably. 
          </p>           
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/BaseObjectPool.html"><code>BaseObjectPool</code></a>
             provides an abstract base implementation of <code>ObjectPool</code>. Clients are
             encouraged but not required to extend <code>BaseObjectPool</code> for new 
             <code>ObjectPool</code> implementations.
          </p>
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/KeyedObjectPool.html"><code>KeyedObjectPool</code></a>
             defines a similiar interface for pools composed of heterogenous objects:
          </p>
<source>
public interface KeyedObjectPool {
    Object borrowObject(Object key);
    void returnObject(Object key, Object borrowed);
}
</source>           
        </subsection>
        <subsection name="PoolableObjectFactory">
          <p>
             The <i>Pool</i> package makes it possible separate the way in which instances
             are pooled from the way in which instances are created and destroyed. 
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/PoolableObjectFactory.html"><code>PoolableObjectFactory</code></a>
             supports this by providing a generic inteface for the lifecycle of a pooled object:
          </p>
<source>
public interface PoolableObjectFactory {
    Object makeObject();
    void activateObject(Object obj);
    void passivateObject(Object obj);
    boolean validateObject(Object obj);
    void destroyObject(Object obj);
}
</source>           
          <p>
             <code>ObjectPool</code> implementations may be written to accept arbitrary
             <code>PoolableObjectFactory</code>s.
             This makes is possible for clients to select pooling-behavior distinct 
             from the kinds of objects that are pooled.  
          </p>           
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/BasePoolableObjectFactory.html"><code>BasePoolableObjectFactory</code></a>
             provides an abstract base implementation of <code>PoolableObjectFactory</code> that
             makes implementations a snap.
          </p>
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/KeyedPoolableObjectFactory.html"><code>KeyedPoolableObjectFactory</code></a>
             defines a similiar interface for <code>KeyedObjectPool</code>s:
          </p>
<source>
public interface KeyedPoolableObjectFactory {
    Object makeObject(Object key);
    void activateObject(Object key, Object obj);
    void passivateObject(Object key, Object obj);
    boolean validateObject(Object key, Object obj);
    void destroyObject(Object key, Object obj);
}
</source>           
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/BaseKeyedPoolableObjectFactory.html"><code>BaseKeyedPoolableObjectFactory</code></a>
             provides an abstract base implementation of <code>KeyedPoolableObjectFactory</code> that
             makes implementations a snap.
          </p>
        </subsection>
        <p>
            The 
            <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/impl/package-summary.html">org.apache.commons.pool.impl</a> 
            package provides some <i>Pool</i> implementations.
        </p>
        <subsection name="StackObjectPool">
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/impl/StackObjectPool.html"><code>StackObjectPool</code></a>
             will pool a finite number of "idle" instances, but will create new instances a needed in 
             order to support high demand.
          </p>
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/impl/StackKeyedObjectPool.html"><code>StackKeyedObjectPool</code></a>
             offers the same behavior for keyed pools.
          </p>
        </subsection>
        <subsection name="GenericObjectPool">
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/impl/GenericObjectPool.html"><code>GenericObjectPool</code></a>
             provides a wide variety of configuration options, including the ablity to cap the number of idle or
             active instances, to evict instances as they sit idle in the pool, etc.
          </p>
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/impl/GenericKeyedObjectPool.html"><code>GenericKeyedObjectPool</code></a>
             offers the same behavior for keyed pools.
          </p>
        </subsection>
        <subsection name="SoftReferenceObjectPool">
          <p>
             <a href="http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/impl/SoftReferenceObjectPool.html"><code>SoftReferenceObjectPool</code></a>
             can grow as needed, but allows the garbage collector to evict idle instances from the pool as needed. 
          </p>
        </subsection>
      </section>
   </body>
</document>
