天天看點

Apache Commons Pool進階配置項詳解

Apache Commons Pool進階配置項詳解

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);

        }