Apache Common Pool的使用
Apache Common Pool包括很多已經實現的Pool,常用的Pool有GenericObjectPool,GenericKeyedObjectPool。本文主要講述如何使用以上兩種Pool,其它的用法相似。使用Common Pool需求到Apache網站下載commons-pool.jar和commons-collections.jar兩個包。
一.GenericObjectPool類
GenericObjectPool類在rg.apache.commons.pool.impl包中,構造函數如下:
public GenericObjectPool(org.apache.commons.pool.PoolableObjectFactory ,
int ,byte ,long , boolean ,boolean )
由構造函數的定義可以看出,要想使用GenericObjectPool,必須要實現PoolableObjectFactory接口。然後,利用GenericObjectPool的方法獲得Pool中的實例。
1. 實現PoolableObjectFactory接口
實現PoolableObjectFactory接口,需實現以下方法。其中makeObject在創建實例時調用,通過自定義代碼生成並返回需求的實例,activateObject方法在從Pool中拿出一個實例的同時調用,passivateObject方法在實例返還給Pool時調用。
public class MyPoolableObjectFactory implements PoolableObjectFactory {
//創建對象實例。同時可以分配這個對象適用的資源。
public Object makeObject() throws Exception {
Connection con = getConnection();
renturn con;
}
// 銷燬對象,實際上提供了釋放對象佔用資源的接口。
public void destroyObject(Object obj) throws Exception {
System.out.println("destory Object");
}
//查詢對象有效性,這個方法一般在 activateObject 方法執行後調用
public boolean validateObject(Object obj) {
return true;
}
// 激活一個對象。
public void activateObject(Object obj) throws Exception {
System.out.println("active object");
}
//掛起一個對象
public void passivateObject(Object obj) throws Exception {
System.out.println("return object");
}
}
2. 使用GenericObjectPool
實現PoolableObjectFactory接口後,可以直接使用GenericObjectPool構造函數獲得其實例,代碼如下:
org.apache.commons.pool.PoolableObjectFactory factory = new MyPoolableObjectFactory();
GenericObjectPool pool= new GenericObjectPool(factory, 100, GenericObjectPool.WHEN_EXHAUSTED_BLOCK, 100, true, true);
其中,第一個100爲最大激活數,第二個爲最大等待數。
2.1.GenericObjectPool參數設置
GenericObjectPool有幾個重要的參數:最大激活數(maxActive),最大等待數(maxWait),最大空閒數(maxIdle),最大空閒時間(maxIdleTime)等。
A). 最大激活數-在Pool中註冊,並且正在使用的實例數。調用pool.setMaxActive()方法設置。
B). 最大等待數-在Pool中註冊,等待獲取實例的申請數。調用pool.setMaxWait()方法設置。
C). 最大空閒數-在Pool中註冊,並且正處於空閒狀態的實例數。調用pool.setMaxIdle()方法設置
D). 最大空閒時間-在Pool中,實例空閒的最長時間。調用pool. setMinEvictableIdleTimeMillis(maxIdleTime)及pool. setTimeBetweenEvictionRunsMillis(maxIdleTime)方法共同設置。
2.2.Pool中實例的操作
Pool中實例的操作,主要包括實例的獲取及實例的返還。使用完實例之後,需及時返還,否則實例還是處理激活狀態,不能爲被後面的申請重複利用。
A).實例的獲取使用pool.borrowObject()方法
B).實例返還使用pool.returnObject(con)方法,其中con爲pool中獲取的實例。
二.GenericKeyedObjectPool類
GenericKeyedObjectPool類在rg.apache.commons.pool.impl包中,構造函數如下:
public GenericObjectPool(org.apache.commons.pool.KeyedPoolableObjectFactory ,
int ,byte ,long , boolean ,boolean )
由構造函數的定義可以看出,要想使用GenericKeyedObjectPool,必須要實現KeyedPoolableObjectFactory接口。然後,利用GenericKeyedObjectPool的方法獲得Pool中的實例。
1. 實現KeyedPoolableObjectFactory接口
實現KeyedPoolableObjectFactory接口,需實現以下方法。其中makeObject在創建實例時調用,通過自定義代碼生成並返回需求的實例,注意要以一個形參爲key創建;activateObject方法在從Pool中拿出一個實例的同時調用,passivateObject方法在實例返還給Pool時調用。要實現的方法比PoolableObjectFactory要實現的方法都多了一個參數key。
public class MyKeyedPoolableObjectFactory implements KeyedPoolableObjectFactory {
//創建對象實例。同時可以分配這個對象適用的資源。
public Object makeObject(Object key) throws Exception {
Connection con = getConnection(key);
renturn con;
}
// 銷燬對象,實際上提供了釋放對象佔用資源的接口。
public void destroyObject(Object key, Object obj) throws Exception {
System.out.println("destory Object");
}
//查詢對象有效性,這個方法一般在 activateObject 方法執行後調用
public boolean validateObject(Object key, Object obj) {
return true;
}
// 激活一個對象。
public void activateObject(Object key, Object obj) throws Exception {
System.out.println("active object");
}
//掛起一個對象
public void passivateObject(Object key, Object obj) throws Exception {
System.out.println("return object");
}
}
2. 使用GenericKeyedObjectPool
實現KeyedPoolableObjectFactory接口後,可以直接使用GenericKeyedObjectPool構造函數獲得其實例,代碼如下:
org.apache.commons.pool.KeyedPoolableObjectFactory factory = new MyKeyedPoolableObjectFactory();
GenericKeyedObjectPool pool= new GenericKeyedObjectPool(factory, 100, GenericObjectPool.WHEN_EXHAUSTED_BLOCK, 100, true, true);
其中,第一個100爲最大激活數,第二個爲最大等待數。
2.1.GenericKeyedObjectPool參數設置
GenericKeyedObjectPool參數設置與GenericObjectPool類似。
2.2.Pool中實例的操作
Pool中實例的操作,主要包括實例的獲取及實例的返還。使用完實例之後,需及時返還,否則實例還是處理激活狀態,不能爲被後面的申請重複利用。帶key的Pool的操作方法,也相應的都加了參數key。
A).實例的獲取使用pool.borrowObject(Object key)方法
B).實例返還使用pool.returnObject(Object key, Object con)方法,其中con爲pool中獲取的實例。