Apache Common Pool的使用

Apache Common Pool的使用

 

Apache Common Pool包括很多已經實現的Pool,常用的PoolGenericObjectPoolGenericKeyedObjectPool。本文主要講述如何使用以上兩種Pool,其它的用法相似。使用Common Pool需求到Apache網站下載commons-pool.jarcommons-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)方法,其中conpool中獲取的實例。

 

二.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中實例的操作,主要包括實例的獲取及實例的返還。使用完實例之後,需及時返還,否則實例還是處理激活狀態,不能爲被後面的申請重複利用。帶keyPool的操作方法,也相應的都加了參數key

A).實例的獲取使用pool.borrowObject(Object key)方法

B).實例返還使用pool.returnObject(Object key, Object con)方法,其中conpool中獲取的實例。

發佈了24 篇原創文章 · 獲贊 0 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章