使用方式參考:http://www.blogways.net/blog/2014/01/15/apache-commons-pool.htmlhtml
maxTotal 容許建立資源的最大數量,默認值 -1,-1 表明無數量限制(int類型)java
blockWhenExhausted 默認值 true ,當資源耗盡時,是否阻塞等待獲取資源apache
maxWaitMillis 獲取資源時的等待時間,單位毫秒。當 blockWhenExhausted 配置爲 true 時,此值有效。 -1 表明無時間限制,一直阻塞直到有可用的資源。(long類型)數據結構
testOnBorrow 默認值 false ,當設置爲true時,調用 factory.validateObject() 方法spa
testOnCreate 默認值 false,當設置爲true時,調用 factory.validateObject() 方法.net
(備註:若是 testOnBorrow 或者 testOnCreate 中有一個 配置 爲 true 時,就調用 factory.validateObject() )線程
lifo 資源的存取數據結構,默認值 true,true 資源按照棧結構存取,false 資源按照隊列結構存取code
fairness 當從池中獲取資源或者將資源還回池中時 是否使用 java.util.concurrent.locks.ReentrantLock.ReentrantLock 的公平鎖機制。 默認值 false, true 使用公平鎖,false 不使用公平鎖,htm
timeBetweenEvictionRunsMillis 回收資源線程的執行週期,單位毫秒。默認值 -1 ,-1 表示不啓用線程回收資源。(long類型)對象
evictionPolicyClassName 資源回收策略, 默認值 org.apache.commons.pool2.impl.DefaultEvictionPolicy(String類型)
minEvictableIdleTimeMillis 資源最小空閒時間, 默認值 1800000,單位 毫秒,(long類型 )
softMinEvictableIdleTimeMillis 軟資源最小空閒時間, 默認值 -1 ,單位 毫秒,(long類型 )
(備註,這個兩個參數,在資源回收策略中,會使用到)
maxIdle 最大空閒資源數,默認值 8 (int類型)
minIdle 最小空閒資源數,默認值 0 (int類型 )
testWhileIdle 默認值 false; 設置爲 true 時,當回收策略返回false時,則 調用 factory.activateObject()和factory.validateObject()
testOnReturn 默認值 false; 設置爲 true 時,當將資源返還個資源池時候,驗證資源的有效性,調用 factory.validateObject()方法,若是無效,則調用 factory.destroyObject()方法
numTestsPerEvictionRun 資源回收線程執行一次回收操做,回收資源的數量。默認值 3, (int類型)。
備註:當 設置爲0時,不回收資源。
設置爲 小於0時,回收資源的個數爲 (int)Math.ceil( 池中空閒資源個數 / Math.abs(numTestsPerEvictionRun) );
設置爲 大於0時,回收資源的個數爲 Math.min( numTestsPerEvictionRun,池中空閒的資源個數 );
從池中獲取資源的邏輯
1:若是 blockWhenExhausted 配置的 爲 false,從資源池中獲取資源,若是獲取不到,則判斷當前池中的對象數量是否超過了 maxTotal 設置的數量,若是沒有超過,
則經過調用factory.makeObject() 建立對象,並將對象放入池中,執行第2步 。若是超過了,則返回 null,邏輯到此結束。
若是 blockWhenExhausted 配置的 爲 true ,從資源池中獲取資源,若是獲取不到,則判斷當前池中的對象數量是否超過了 maxTotal 設置的數量,若是沒有超過,
則經過調用factory.makeObject() 建立對象,並將對象放入池中,執行第2步 。若是超過了,則阻塞等待,若是 MaxWaitMillis 配置的爲 -1 則 阻塞等待,直到有可用的資源爲止。
若是 maxWaitMillis 配置爲 1000 則 阻塞等待 1000毫秒,若是有可用資源,執行第2步,若是沒有則返回 null,邏輯到此結束。
2:將資源的狀態 修改成 已分配,執行 第 3 步
3:調用 factory.activateObject() 方法,執行 第 4步
4:若是 testOnBorrow 或者 testOnCreate 中有一個 配置 爲 true 時,則調用 factory.validateObject() 方法
5:以上步驟都完成了,返回 資源對象
將資源返還給池的邏輯
1:檢查配置參數 testOnReturn,若是 爲 true,調用 factory.validateObject()方法,驗證資源對象的有效性,驗證結果爲 true,則調用 factory.destroyObject()方法,邏輯到此結束。
驗證結果爲 false,則執行第 2 步。
2:調用 factory.passivateObject()方法,而後執行 第 3 步
3:將資源的狀態 修改成 未分配,執行第 4 步
4:進行判斷 ( 資源池是否關閉 || (maxIdle > -1 ) && ( maxIdle <= 資源池空閒資源個數) )
若是 判斷爲 true,則調用 factory.destroyObject()方法,邏輯到此結束。
若是 判斷爲 false,則 將資源返還給資源池,邏輯到此結束。
Apache_common_pool 啓動一個線程執行釋放資源的工做(使用 java.util.Timer 實現)
從池中回收資源邏輯(回收資源的意思是,將資源從池中刪除掉,例如,若是是TCP連接,則須要將連接斷開,並從池中刪除掉。)
1:根據 evictionPolicyClassName 配置的參數建立回收策略,
默認回收策略源碼
import org.apache.commons.pool2.PooledObject; public class DefaultEvictionPolicy<T> implements EvictionPolicy<T> { public boolean evict(EvictionConfig config, PooledObject<T> underTest, int idleCount) { if (((config.getIdleSoftEvictTime() < underTest.getIdleTimeMillis()) && (config.getMinIdle() < idleCount)) || (config.getIdleEvictTime() < underTest.getIdleTimeMillis())) { return true; } return false; } }
if條件判斷與
(softMinEvictableIdleTimeMillis < 資源的空閒時間 && Math.min(maxIdle,minIdle) < 目前池中空閒的資源數) ||
minEvictableIdleTimeMillis < 資源的空閒時間
等價
2:根據配置的參數 numTestsPerEvictionRun 計算,要回收的資源數量(具體的計算規則,請參照源碼)
3:根據回收策略判斷,資源是否須要回收。若是 是 則將資源從池中刪除,並調用factory.destroyObject()方法。
若是 否 則根據配置的 testWhileIdle 參數,判斷 是否執行 factory.activateObject()和factory.validateObject() 方法。