Commons Pool雖然是牛刀,不但要會用,更重要的是要用好,否則還不如不用,為此,必須掌握Commons Pool的進階參數配置,這是Commons Pool應用中非常重要的一個問題。
這些參數我以.properties檔案的方式在自己的應用使用,但是,這并非Commons Pool所要求的,下面是我為可配置參數所寫的一個properties檔案,内容和注釋如下:
pool.properties
#設定後進先出的池政策
lifo=true
#允許最大活動對象數
maxActive=24
#允許最大空閑對象數
maxIdle=6
#允許最大等待時間毫秒數
maxWait=150000
#被空閑對象回收器回收前在池中保持空閑狀态的最小時間毫秒數
minEvictableIdleTimeMillis=100000
#允許最小空閑對象數
minIdle=0
#設定在進行背景對象清理時,每次檢查對象數
numTestsPerEvictionRun=1
#指明是否在從池中取出對象前進行檢驗,如果檢驗失敗,則從池中去除連接配接并嘗試取出另一個.
testOnBorrow =false
#指明是否在歸還到池中前進行檢驗
testOnReturn =false
#指明連接配接是否被空閑連接配接回收器(如果有)進行檢驗.如果檢測失敗,則連接配接将被從池中去除.
testWhileIdle=false
#在空閑連接配接回收器線程運作期間休眠的時間毫秒數. 如果設定為非正數,則不運作空閑連接配接回收器線程
timeBetweenEvictionRunsMillis=120000
#當池中對象用完時,請求新的對象所要執行的動作
whenExhaustedAction=1
實際上Commons Pool并不要求寫這麼個檔案,對池的配置,Commons Pool也很随意,你不配置也能用。當然這個配置檔案不能直接給Commons Pool使用,還需要自己讀取每個元素的資訊然後才能給pool來使用。
其實最好的方式是建構一個GenericKeyedObjectPool.Config的對象,将這個對象給pool來使用即可。
最簡單的方法是:
GenericKeyedObjectPool.Config cfg = new GenericKeyedObjectPool.Config();
cfg.set.....(prop.get(....,defaultvalue));
....
有了cfg對象,再建構池時候,就簡單了:
static {
GenericKeyedObjectPool.Config cfg = new GenericKeyedObjectPool.Config();
cfg.lifo = Boolean.valueOf(SysParamsToolkit.getProperty("lifo", "true"));
cfg.maxActive = Integer.valueOf(SysParamsToolkit.getProperty("maxActive", "18"));
cfg.maxIdle = Integer.valueOf(SysParamsToolkit.getProperty("maxIdle", "6"));
cfg.maxWait = Integer.valueOf(SysParamsToolkit.getProperty("maxWait", "150000"));
cfg.minEvictableIdleTimeMillis = Integer.valueOf(SysParamsToolkit.getProperty("minEvictableIdleTimeMillis", "100000"));
cfg.minIdle = Integer.valueOf(SysParamsToolkit.getProperty("minIdle", "0"));
cfg.numTestsPerEvictionRun = Integer.valueOf(SysParamsToolkit.getProperty("numTestsPerEvictionRun", "1"));
cfg.lifo = Boolean.valueOf(SysParamsToolkit.getProperty("testOnBorrow", "false"));
cfg.lifo = Boolean.valueOf(SysParamsToolkit.getProperty("testOnReturn", "false"));
cfg.lifo = Boolean.valueOf(SysParamsToolkit.getProperty("testWhileIdle", "false"));
cfg.timeBetweenEvictionRunsMillis = Integer.valueOf(SysParamsToolkit.getProperty("timeBetweenEvictionRunsMillis", "120000"));
cfg.whenExhaustedAction = Byte.valueOf("whenExhaustedAction", 1);
pool = new GenericKeyedObjectPool(new BaseKeyedPoolableObjectFactory() {
@Override
public Object makeObject(Object o) throws Exception {
if (o != null && o instanceof Socket)
return o;
else
return null;
}
}, cfg);
}
本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/218354,如需轉載請自行聯系原作者