1. 程式人生 > >Apache Commons pool 簡介和pool連線池程式碼

Apache Commons pool 簡介和pool連線池程式碼

在實際中工作,我們經常遇到需要連線池的地方,特別是資料庫連線池。

我們為什麼需要池呢?因為這些資源的建立,都很消耗資源。因此,我們使用一個物件池,裡面預先建立了一些資源物件。當我們需要時,從池中取出物件,而不需要時,把物件返回池中。這樣就可以提高程式碼執行的效率。

Apache Commons Pool(http://commons.apache.org/pool/)為我們提供了很方便的介面來實現物件池。我們唯一需要實現的就是如何產生物件,而不用去考慮一堆多執行緒問題。

2013年,Apache Commons Pool 2.0 釋出,這是一個完全重寫的物件池的實現,顯著的提升了效能和可伸縮性,特別是在高併發載入的情況下。2.0 版本包含可靠的例項跟蹤和池監控,要求 JDK 1.6 或者更新版本。這個版本完全不相容1.x版本;

Apache Commons Pool從個人的角度來說,有三個關鍵點

1.Factory

回撥。用於物件建立,銷燬,驗證,防止堵塞等。

2.Pool的配置

池的引數。比如最大多少個,最小多少個,最長堵塞時間等。

3.Pool例項

實際幹活的。

ApacheCommons Pool 1.x示例程式碼:

packagetest.ffm83.commons.pool;

importjava.text.SimpleDateFormat;

importjava.util.Date;

importorg.apache.commons.pool.BasePoolableObjectFactory;

importorg.apache.commons.pool.impl.GenericObjectPool;

/**

 *commons pool的簡單實用,基於1.x版本

 * 1.Factory   TestPoolableObjectFactory

 * 2.Pool的配置   就是pool

 * 3.Pool例項  Resource

 * @author範芳銘

 */

public class PoolBaseUsage {

     public static void main(String[] args) {

         final GenericObjectPool pool = new

GenericObjectPool(

new TestPoolableObjectFactory());

         pool.setMaxActive(2);

         for (int i = 0; i < 6; i++) {

              new Thread(new Runnable() {

                   @Override

                   public voidrun() {

                       try {

                            Objectobj = pool.borrowObject();// 獲取

                            System.out.println(obj);

                            Thread.sleep(5000);

                            pool.returnObject(obj);//歸還了

                       }catch (Exception e){

                            e.printStackTrace();

                       }

                   }

              }).start();

         }

     }

     static classTestPoolableObjectFactory extends BasePoolableObjectFactory{

         public Object makeObject() throws Exception {

              return newResource();

         }

     }

     static classResource {

         public static int id;

         private int rid;

         public Resource() {

              synchronized (this) {

                   rid = id++;

              }

         }

         public intgetRid() {

              return rid;

         }

         @Override

         public String toString() {

              SimpleDateFormatdf = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設定日期格式

              Stringstr = df.format(newDate()) + ","+ "id:" + rid;

              return str;

         }

     }

}

結果一些說明,在這裡設定了最大執行緒數為2,啟用6個執行緒去執行:

執行結果:

2014-12-19 14:41:43,id:1

2014-12-19 14:41:43,id:0

2014-12-19 14:41:48,id:0

2014-12-19 14:41:48,id:1

2014-12-19 14:41:53,id:1

2014-12-19 14:41:53,id:0

仔細看這個執行結果,能看到明顯分成了3波在執行。

如果我們調整下最大執行緒數,那麼結果應該有明顯變化。

將最大執行緒數調整為 pool.setMaxActive(4);

執行結果如下:

2014-12-19 15:08:39,id:3

2014-12-19 15:08:39,id:1

2014-12-19 15:08:39,id:2

2014-12-19 15:08:39,id:0

2014-12-19 15:08:44,id:3

2014-12-19 15:08:44,id:1

能夠明顯看到4個執行緒一起執行,另外兩個後續執行;