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
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個執行緒一起執行,另外兩個後續執行;