common-pool 是一個對象池框架,使用非常簡單,應用非常普遍,值得大家學習。
要想使用common-pool ,我們只需要提供一個工廠類,用於爲“池”填充對象。如:
import org.apache.commons.pool.PoolableObjectFactory;
public class PooledObjectFactory implements PoolableObjectFactory {
private static int index = 0;
// 創建對象實例,用於填充對象池。同時可以分配這個對象適用的資源。
public Object makeObject() throws Exception {
Integer obj = new Integer(++index);
System.out.println("創建對象實例:" + obj);
return obj;
}
// 銷燬對象,銷燬對象池時被調用,連接池調用invalidateObject(obj);時被調用。
public void destroyObject(Object obj) throws Exception {
System.out.println("銷燬對象:" + obj);
}
// 查詢對象有效性,需要對象池設置setTestOnBorrow(true)
public boolean validateObject(Object obj) {
System.out.println("檢查對象有效性:" + obj);
return true;
}
// 激活一個對象,從對象池獲取對象時被調用。
public void activateObject(Object obj) throws Exception {
System.out.println("激活對象:" + obj);
}
// 掛起一個對象,將對象還給對象池時被調用。
public void passivateObject(Object obj) throws Exception {
System.out.println("掛起對象:" + obj);
}
}
寫完這個工廠之後我們就可以使用對象池了,如下:
PooledObjectFactory factory = new PooledObjectFactory();//對象工廠
GenericObjectPool pool = new GenericObjectPool(factory);//對象池
pool.setTestOnBorrow(true);//設置是否在獲取對象時候檢查有效性
Object obj = pool.borrowObject();//從池取出object,由factory負責提供
pool.returnObject(obj);//把取出的object還給對象池
pool.close();//銷燬對象池,將調用對象工廠的銷燬方法