apache commons-pool2中GenericObjectPoolConfig的maxTotal、maxIdle、minIdle屬性理解
Apache commons-pool本質上是"物件池",即通過一定的規則來維護物件集合的容器。commos-pool在很多場景中,用來實現"連線池"/"任務worker池"等。大家常用的dbcp資料庫連線池、jedis連線池,也都是基於commons-pool實現。
關於物件池,commons-pool2中有如下類關係(Cloneable是rt.jar的)
其中,GenericObjectPoolConfig是在GenericObjectPool構造的時候使用的,用來設定pool的maxTotal、maxIdle、minIdle等屬性。
我們熟知的JedisPool,即是利用了commons-pool2來實現的。在jedis中 JedisPoolConfig 繼承自 GenericObjectPoolConfig 。JedisPool稱為資源池、連線資源池池,簡稱連線池,參見JedisPool#getResource。
package redis.clients.jedis; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; public class JedisPoolConfig extends GenericObjectPoolConfig { public JedisPoolConfig() { // defaults to make your life with connection pool easier :) setTestWhileIdle(true); setMinEvictableIdleTimeMillis(View Code60000); setTimeBetweenEvictionRunsMillis(30000); setNumTestsPerEvictionRun(-1); } }
關於minIdle、maxIdle、maxTotal這三個屬性
minIdle:物件池中最小空閒的物件個數,預設為0。new一個物件池時,會初始建立minIdle個物件(實際上並沒有,而是在需要的時候才開始建立,我們的java執行緒池就是這麼做的)。當開啟了回收機制後,如果物件空閒時間達到了設定值,則會被銷燬、移出物件池。但物件池中至少會保留minIdle個物件。
maxIdle:物件池中最大空閒的物件個數。在歸還物件時,物件會出於idle狀態,這時,物件池會判斷idle物件個數,如果已經達到maxIdle,則物件會被直接銷燬,否則才會放回物件池(此時,物件池的活躍物件個數+1)。
maxTotal:物件池中允許的最大物件個數。在從物件池獲取物件時,如果物件池中有idle物件,則直接返回一個物件。否則,判斷活躍物件是否已經達到maxTotal,是的話說明所有物件都在幹活,這時就會發生阻塞等待,直到有物件歸還物件池;沒有達到maxTotal,則就會建立一個新物件供使用。(獲取物件的結果是:物件池的活躍物件個數-1)
物件池中,物件生命週期
阻塞獲取物件時的超時引數
- maxWaitMillis
當連線池資源耗盡時,獲取可用物件所需的等待時間,超出則拋異常,預設為-1即永不超時 - blockWhenExhausted
當這個值為true的時候,maxWaitMillis引數才能生效。為false的時候,當連線池沒資源,則立馬拋異常。預設為true
物件池物件移除策略
常見的移除策略有:
1. LRU(Least Recently Used): 淘汰最長時間未被使用的
2. LFU(least frequently used)淘汰一定時期內被訪問次數最少的
ref: