2006年02月22日

Commons Pool

Commons Poolはプロジェクトの名前のとおりオブジェクトをプールする仕組みを提供している。
有名なところではCommons DBCPがCommons Poolを利用している。

仕組み自体はとてもシンプルでいくつかの一般的なPoolのインプリメンテーションが用意されている。

簡単な使い方
1.ObjectPoolクラスにObjectPoolFactoryを渡してインスタンスを作成
2.ObjectPoolクラスから利用するインスタンスを取り出す。
3.使い終わったらObjectPoolに返す。

とシンプル。

以下、簡単なサンプル

プールに格納されるクラス

package sample.commons.pool;

import java.util.Date;


/**
* プールされるオブジェクト
*/
public class PooledObject {

public String toString() {
return super.toString();
}
}


プールに格納するクラスの操作を行うFacotry
PoolableObjectFactoryを実装する。

package sample.commons.pool;

import org.apache.commons.pool.PoolableObjectFactory;


/**
* プールされるオブジェクトに関する操作を行う
*/
public class SimpleFactory implements PoolableObjectFactory {
/**
* プールするオブジェクトを作成する
* {@inheritDoc}
*/
public Object makeObject() throws Exception {
System.out.println("Call makeObject.");

return new PooledObject();
}

/**
* オブジェクトを破棄する
* {@inheritDoc}
*/
public void destroyObject(Object obj) throws Exception {
System.out.println("Call destroyObject.");
}

/**
* オブジェクトを検証する
* {@inheritDoc}
*/
public boolean validateObject(Object obj) {
// XXX プールされるオブジェクトに対して検証するときに使う。

return true;
}

/**
* オブジェクトを再初期化する
* {@inheritDoc}
*/
public void activateObject(Object obj) throws Exception {
System.out.println("Call activateObject.");
}

/**
* オブジェクトを非活性化?する
* {@inheritDoc}
*/
public void passivateObject(Object obj) throws Exception {
System.out.println("Call passivateObject.");
}
}


プールを扱うクラス
ObjectPoolは、GenericObjectPoolを使用した。

package sample.commons.pool;

import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPoolFactory;


/**
* プールを扱うクラス
*/
public class PoolingSample {
private ObjectPool pool;

public PoolingSample() {
GenericObjectPoolFactory factory =
new GenericObjectPoolFactory(new SimpleFactory());
pool = factory.createPool();
}

/**
* プールから取り出す
* @return プールされているオブジェト
*/
PooledObject borrowObject() {
try {
return (PooledObject) pool.borrowObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}

/**
* プールに返却する
* @param obj
*/
void returnObject(Object obj) {
try {
pool.returnObject(obj);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* プールのクリア
*/
void clear() {
try {
pool.clear();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* プールのクローズ
*/
void close() {
try {
pool.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}



使い方

        PoolingSample sample = new PoolingSample();
Object obj = sample.borrowObject();
System.out.println(obj);
obj = sample.borrowObject();
System.out.println(obj);
obj = sample.borrowObject();
System.out.println(obj);
sample.returnObject(obj);
obj = sample.borrowObject();
System.out.println(obj);
sample.returnObject(obj);
sample.clear();
sample.close();


これを実行すると以下のように出力される。

Call makeObject.
Call activateObject.
sample.commons.pool.PooledObject@16a55fa
Call makeObject.
Call activateObject.
sample.commons.pool.PooledObject@32c41a
Call makeObject.
Call activateObject.
sample.commons.pool.PooledObject@e89b94
Call passivateObject.
Call activateObject.
sample.commons.pool.PooledObject@e89b94
Call passivateObject.
Call destroyObject.


一種類のObjectを格納するObjectPoolに対して、多数の種類のObjectを格納するための
KeyedObjectPoolも用意されている。

また、実装されているのは必要最小限のPool実装(GenericObjectPool、GenericKeyedObjectPool、
SoftReferenceObjectPool、StackKeyedObjectPool、StackObjectPool)なので必要に応じて実装される
ことを想定しているようだ。

posted by tfunato at 01:03 | コメント[0] | トラックバック[0] | Java このエントリーを含むはてなブックマーク はてなブックマーク - Commons Pool
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※承認されるまで反映されません!
この記事へのTrackBack URL
http://blog.seesaa.jp/tb/13589269