有名なところでは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)なので必要に応じて実装される
ことを想定しているようだ。
