apache-common-pool2使用以及(配置參數詳解,以及資源回收,從池中獲取資源,將資源返還給池)

使用方式參考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() 方法。

相關文章
相關標籤/搜索