天天看點

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

        }

 本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/218354,如需轉載請自行聯系原作者