一般的なオブジェクトプーリングAPIと、そのいくつかの実装です。 {@primary Generic Object pooling API with several implementations.}

org.apache.commons.pool パッケージはシンプルなオブジェクトのプーリングを行うためのインターフェイスと 新たなプール実装を作成する際に有用と思われるいくつかの基底クラスを定義します。 このAPIは全てのオブジェクトを同じ場所にプールし扱う方法と キーを介して対応するオブジェクトをプーリングする方法とをサポートします。 {@primary The org.apache.commons.pool package defines a simple interface for a pool of object instances, and a handful of base classes that may be useful when creating pool implementations. The api supports pooling of unique objects which can be requested via a key as well as pools where all objects are equivalent.}

org.apache.commons.pool.impl パッケージはいくつかのプールの実装を含みます。 {@link org.apache.commons.pool.impl.StackObjectPool StackObjectPool} は限られた数のインスタンスの再利用のサポートに有用です。 また必要となる新たなインスタンスをプール内にあらかじめ生成する機能を持ちます。 {@link org.apache.commons.pool.impl.GenericObjectPool GenericObjectPool} はデータベースコネクションプール等に有用な様々な設定オプションと限られた数のオブジェクトのセットを扱う機能を持ちます。 {@link org.apache.commons.pool.impl.SoftReferenceObjectPool SoftReferenceObjectPool} は数に制限なくオブジェクトをプールすることができますが、必要であればプール内のアイドル状態のオブジェクトを ガベージコレクタに削除させることができます。 これらはそれぞれオブジェクトのアクセスにキーを使うものと使わないものの2種類があります。 {@primary The org.apache.commons.pool.impl package contains several pool implementations. {@link org.apache.commons.pool.impl.StackObjectPool StackObjectPool} is useful for supporting reuse of a limited number of instances while allowing new instances to be created as needed to support high demand. {@link org.apache.commons.pool.impl.GenericObjectPool GenericObjectPool} has many configuration options and can support a limited set of objects such as would be useful in a database connection pool. {@link org.apache.commons.pool.impl.SoftReferenceObjectPool SoftReferenceObjectPool} has no limit on the number of objects in the pool, but garbage collector can remove idle objects from the pool as needed. There are also keyed versions of the first two.}

以下に HashMap をプーリングする簡単なサンプルを示します。 まず {@link org.apache.commons.pool.ObjectPoolFactory ObjectPoolFactory} を作成します。 {@primary Here is a simple example of pooling HashMap's. First create an {@link org.apache.commons.pool.ObjectPoolFactory ObjectPoolFactory}}

    public class HashMapFactory 
        extends {@link org.apache.commons.pool.BasePoolableObjectFactory BasePoolableObjectFactory}
    {
        /**
         * プールに渡されるインスタンスを生成します。
         * @return プールに渡されるインスタンス
         */
        public Object makeObject() 
            throws Exception
        {
            return new HashMap();
        }
        
        /**
         * プールに渡されるインスタンスの後処理をします。
         * @param obj 後処理を行うインスタンス
         */
        public void passivateObject(Object obj) 
            throws Exception
        {
            Map map = (Map)obj;
            map.clear();
        }
    }
{@primary
    public class HashMapFactory 
        extends {@link org.apache.commons.pool.BasePoolableObjectFactory BasePoolableObjectFactory}
    {
        /**
         * Creates an instance that can be returned by the pool.
         * @return an instance that can be returned by the pool.
         */
        public Object makeObject() 
            throws Exception
        {
            return new HashMap();
        }
        
        /**
         * Uninitialize an instance to be returned to the pool.
         * @param obj the instance to be passivated
         */
        public void passivateObject(Object obj) 
            throws Exception
        {
            Map map = (Map)obj;
            map.clear();
        }
    }
}

プールされた Map を繰り返し利用するクラスの例を以下に示します: {@primary A class that makes frequent use of a Map could then use a pool as shown below:}

    public class Foo
    {
        private {@link org.apache.commons.pool.ObjectPool ObjectPool} pool;
        public Foo()
        {
            {@link org.apache.commons.pool.PoolableObjectFactory PoolableObjectFactory} factory = new HashMapFactory();
            pool = new StackObjectPool(factory, 1000);
        }

        public doSomething()
        {
            ...
            Map map = null;
            try
            {
                map = (Map)pool.borrowObject();
                // use map
                ...
            }
            finally
            {
                if (map != null)
                {
                    pool.returnObject(map);
                }
            }
            ...
        }
    }

上記例では {@link org.apache.commons.pool.ObjectPool ObjectPool} を利用しましたが、 他の提供される実装または特別な目的に特化した実装も同じように扱うことができます。 {@primary The above example shows how one would use an {@link org.apache.commons.pool.ObjectPool ObjectPool}. The other supplied implementations or another special purpose pool would be used similarly.}

@translator 日置 聡 @status firstdraft @update 2004/02/21