天天看點

redis之如何配置jedisPool參數

maxWait 連接配接池中連接配接用完時,新的請求等待時間,毫秒

timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每

timeBetweenEvictionRunsMillis毫秒秒檢查一次連接配接池中空閑的連接配接,把空閑時間超過minEvictableIdleTimeMillis毫秒的連接配接斷開,直到連接配接池中的連接配接數到minIdle為止

minEvictableIdleTimeMillis 連接配接池中連接配接可空閑的時間,毫秒

removeAbandoned true,false,是否清理removeAbandonedTimeout秒沒有使用的活動連接配接,清理後并沒有放回連接配接池

removeAbandonedTimeout 活動連接配接的最大空閑時間

logAbandoned true,false,連接配接池收回空閑的活動連接配接時是否列印消息

minEvictableIdleTimeMillis,removeAbandonedTimeout這兩個參數針對的連接配接對象不一樣,minEvictableIdleTimeMillis針對連接配接池中的連接配接對象,removeAbandonedTimeout針對未被close的活動連接配接.

在配置時,主要難以了解的主要有:removeAbandoned 、logAbandoned、removeAbandonedTimeout、maxWait這四個參數,設定了rmoveAbandoned=true那麼在getNumActive()快要到getMaxActive()的時候,系統會進行無效的Connection的回收,回收的Connection為removeAbandonedTimeout(預設300秒)中設定的秒數後沒有使用的Connection,激活回收機制好像是getNumActive()=getMaxActive()-2。

:)

  logAbandoned=true的話,将會在回收事件後,在log中列印出回收Connection的錯誤資訊,包括在哪個地方用了Connection卻忘記關閉了,在調試的時候很有用。

  在這裡私人建議maxWait的時間不要設得太長,maxWait如果設定太長那麼用戶端會等待很久才激發回收事件

validationQuery

DBCP提供的validationQuery參數進行連接配接的預檢測,它會在與連接配接池互動的過程中加入一些鈎子,定點執行validationQuery指定的SQL語句,如果SQL語句執行成功,表示此連接配接有效,配置設定給應用,如果執行失敗,則丢棄此連接配接,這種方法還能應對網絡故障等問題造成的MySQL連接配接失效問題。其他的一些方法,比如空閑連接配接檢測,樂觀擷取連接配接等方式,都無法保證完全對應用透明,應用還是能感覺到資料庫操作失敗。

minEvictableIdleTimeMillis

連接配接池中連接配接,在時間段内一直空閑, 被逐出連接配接池的時間

timeBetweenEvictionRunsMillis

在構造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也會使用GenericObjectPool]時,會生成一個内嵌類Evictor,實作自Runnable接口。如果timeBetweenEvictionRunsMillis大于0,每過

timeBetweenEvictionRunsMillis毫秒Evictor會調用evict()方法,檢查連接配接池中的連接配接的閑置時間是否大于

minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0時則忽略,預設為30分鐘),是則銷毀此對象,然後調用ensureMinIdle方法檢查確定池中對象個數不小于_minIdle。如果連接配接池的連接配接數小于最小空閑連接配接數,則建立資料庫連接配接,同時檢查連接配接池的連接配接是否小于maxIdle,是則把剛建立的連接配接放入連接配接池中,否則銷毀此對象。

https://github.com/xetorthio/jedis/issues/937

redis之如何配置jedisPool參數

JedisPool的配置參數很大程度上依賴于實際應用需求、軟硬體能力,JedisPool的配置參數大部分是由JedisPoolConfig的對應項來指派的。

maxActive:控制一個pool可配置設定多少個jedis執行個體,通過pool.getResource()來擷取;如果指派為-1,則表示不限制;如果pool已經配置設定了maxActive個jedis執行個體,則此時pool的狀态就成exhausted了,在JedisPoolConfig

maxIdle:控制一個pool最多有多少個狀态為idle的jedis執行個體;

whenExhaustedAction:表示當pool中的jedis執行個體都被allocated完時,pool要采取的操作;預設有三種WHEN_EXHAUSTED_FAIL(表示無jedis執行個體時,直接抛出NoSuchElementException)、WHEN_EXHAUSTED_BLOCK(則表示阻塞住,或者達到maxWait時抛出JedisConnectionException)、WHEN_EXHAUSTED_GROW(則表示建立一個jedis執行個體,也就說設定的maxActive無用);

maxWait:表示當borrow一個jedis執行個體時,最大的等待時間,如果超過等待時間,則直接抛出JedisConnectionException;

testOnBorrow:在borrow一個jedis執行個體時,是否提前進行alidate操作;如果為true,則得到的jedis執行個體均是可用的;

testOnReturn:在return給pool時,是否提前進行validate操作;

testWhileIdle:如果為true,表示有一個idle object evitor線程對idle

object進行掃描,如果validate失敗,此object會被從pool中drop掉;這一項隻有在timeBetweenEvictionRunsMillis大于0時才有意義;

timeBetweenEvictionRunsMillis:表示idle object evitor兩次掃描之間要sleep的毫秒數;

numTestsPerEvictionRun:表示idle object evitor每次掃描的最多的對象數;

minEvictableIdleTimeMillis:表示一個對象至少停留在idle狀态的最短時間,然後才能被idle object evitor掃描并驅逐;這一項隻有在timeBetweenEvictionRunsMillis大于0時才有意義;

softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基礎上,加入了至少minIdle個對象已經在pool裡面了。如果為-1,evicted不會根據idle

time驅逐任何對象。如果minEvictableIdleTimeMillis>0,則此項設定無意義,且隻有在timeBetweenEvictionRunsMillis大于0時才有意義;

lifo:borrowObject傳回對象時,是采用DEFAULT_LIFO(last in first out,即類似cache的最頻繁使用隊列),如果為False,則表示FIFO隊列;

其中JedisPoolConfig對一些參數的預設設定如下:

testWhileIdle=true

minEvictableIdleTimeMills=60000

timeBetweenEvictionRunsMillis=30000

numTestsPerEvictionRun=-1