Jedis出現(xiàn)connection timeout問題解決方法(JedisPool連接池使用實(shí)例)
今天發(fā)現(xiàn)Jedis 默認(rèn)的連接方式 jedis=new Jedis(“l(fā)ocalhost”,6379),老是發(fā)生connection timeout. 后來(lái)發(fā)現(xiàn)jedis類包還有一種可以設(shè)置最大連接時(shí)間的方法。
1->獲取Jedis實(shí)例需要從JedisPool中獲取;
2->用完Jedis實(shí)例需要還給JedisPool;
3->如果Jedis在使用過(guò)程中出錯(cuò),則也需要還給JedisPool;
代碼如下
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(100);
config.setMaxIdle(20);
config.setMaxWait(1000l);
JedisPool pool;
pool = new JedisPool(config, "2xx.xx.xx.14", 6379);
boolean borrowOrOprSuccess = true;
try {
jedis = pool.getResource();
// do redis opt by instance
} catch (JedisConnectionException e) {
borrowOrOprSuccess = false;
if (jedis != null)
pool.returnBrokenResource(jedis);
} finally {
if (borrowOrOprSuccess)
pool.returnResource(jedis);
}
jedis = pool.getResource();
JedisPool依賴apache類包
commons-pool-1.5.6.jar
1->雖然拋出JedisConnectionException,但實(shí)際上有兩類錯(cuò)誤,一類是pool.getReource(),得不到可用的jedis實(shí)例;另一類是jedis.set/get時(shí)出錯(cuò)也會(huì)拋出這個(gè)Exception;為了實(shí)現(xiàn)區(qū)分,所以根據(jù)instance是否為null來(lái)實(shí)現(xiàn),如果為空就證明instance根本就沒初始化,也就不用return給pool;如果instance不為null,則證明是需要返還給pool的;
2->在instance出錯(cuò)時(shí),也要調(diào)用returnBrokenResource返還給pool,否則下次通過(guò)getResource得到的instance的緩沖區(qū)可能還存在數(shù)據(jù),出現(xiàn)問題!
JedisPool的配置參數(shù)很大程度上依賴于實(shí)際應(yīng)用需求、軟硬件能力。以前沒用過(guò)commons-pool,所以這次花了一整間專門看這些參數(shù)的含義。。。JedisPool的配置參數(shù)大部分是由JedisPoolConfig的對(duì)應(yīng)項(xiàng)來(lái)賦值的。
maxActive:控制一個(gè)pool可分配多少個(gè)jedis實(shí)例,通過(guò)pool.getResource()來(lái)獲??;如果賦值為-1,則表示不限制;如果pool已經(jīng)分配了maxActive個(gè)jedis實(shí)例,則此時(shí)pool的狀態(tài)就成exhausted了,在JedisPoolConfig
maxIdle:控制一個(gè)pool最多有多少個(gè)狀態(tài)為idle的jedis實(shí)例;
whenExhaustedAction:表示當(dāng)pool中的jedis實(shí)例都被allocated完時(shí),pool要采取的操作;默認(rèn)有三種WHEN_EXHAUSTED_FAIL(表示無(wú)jedis實(shí)例時(shí),直接拋出
NoSuchElementException)、WHEN_EXHAUSTED_BLOCK(則表示阻塞住,或者達(dá)到maxWait時(shí)拋出JedisConnectionException)、WHEN_EXHAUSTED_GROW(則表示新建一個(gè)jedis實(shí)例,也就說(shuō)設(shè)置的maxActive無(wú)用);
maxWait:表示當(dāng)borrow一個(gè)jedis實(shí)例時(shí),最大的等待時(shí)間,如果超過(guò)等待時(shí)間,則直接拋出JedisConnectionException;
testOnBorrow:在borrow一個(gè)jedis實(shí)例時(shí),是否提前進(jìn)行alidate操作;如果為true,則得到的jedis實(shí)例均是可用的;
testOnReturn:在return給pool時(shí),是否提前進(jìn)行validate操作;
testWhileIdle:如果為true,表示有一個(gè)idle object evitor線程對(duì)idle object進(jìn)行掃描,如果validate失敗,此object會(huì)被從pool中drop掉;這一項(xiàng)只有在timeBetweenEvictionRunsMillis大于0時(shí)才有意義;
timeBetweenEvictionRunsMillis:表示idle object evitor兩次掃描之間要sleep的毫秒數(shù);
numTestsPerEvictionRun:表示idle object evitor每次掃描的最多的對(duì)象數(shù);
minEvictableIdleTimeMillis:表示一個(gè)對(duì)象至少停留在idle狀態(tài)的最短時(shí)間,然后才能被idle object evitor掃描并驅(qū)逐;這一項(xiàng)只有在timeBetweenEvictionRunsMillis大于0時(shí)才有意義;
softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基礎(chǔ)上,加入了至少minIdle個(gè)對(duì)象已經(jīng)在pool里面了。如果為-1,evicted不會(huì)根據(jù)idle time驅(qū)逐任何對(duì)象。如果minEvictableIdleTimeMillis>0,則此項(xiàng)設(shè)置無(wú)意義,且只有在timeBetweenEvictionRunsMillis大于0時(shí)才有意義;
lifo:borrowObject返回對(duì)象時(shí),是采用DEFAULT_LIFO(last in first out,即類似cache的最頻繁使用隊(duì)列),如果為False,則表示FIFO隊(duì)列;
其中JedisPoolConfig對(duì)一些參數(shù)的默認(rèn)設(shè)置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1
相關(guān)文章
springboot啟動(dòng)時(shí)運(yùn)行代碼詳解
在本篇內(nèi)容中我們給大家整理了關(guān)于在springboot啟動(dòng)時(shí)運(yùn)行代碼的詳細(xì)圖文步驟以及需要注意的地方講解,有興趣的朋友們學(xué)習(xí)下。2019-06-06
Java list如何根據(jù)id獲取子節(jié)點(diǎn)
這篇文章主要介紹了Java list如何根據(jù)id獲取子節(jié)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
關(guān)于Java的ArrayList數(shù)組自動(dòng)擴(kuò)容機(jī)制
這篇文章主要介紹了關(guān)于Java的ArrayList數(shù)組自動(dòng)擴(kuò)容機(jī)制,ArrayList底層是基于數(shù)組實(shí)現(xiàn)的,是一個(gè)動(dòng)態(tài)數(shù)組,自動(dòng)擴(kuò)容,不是線程安全的,只能用在單線程環(huán)境下,需要的朋友可以參考下2023-05-05
踩坑批量更新sql報(bào)錯(cuò),實(shí)際sql能夠正常執(zhí)行的問題
在項(xiàng)目工程遷移過(guò)程中,遇到了一個(gè)批量更新接口在新工程中報(bào)錯(cuò)的問題,通過(guò)分析,排除了代碼錯(cuò)誤的可能,最終發(fā)現(xiàn)是由于數(shù)據(jù)庫(kù)連接配置不當(dāng)導(dǎo)致的,在jdbc連接字符串中加入allowMultiQueries=true參數(shù)后,問題得以解決,這個(gè)參數(shù)的作用是允許SQL批量執(zhí)行2022-12-12
詳解Java的Hibernate框架中的set映射集與SortedSet映射
這篇文章主要介紹了詳解Java的Hibernate框架中的set映射集與SortedSet映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
Spring?WebFlux怎么進(jìn)行異常處理源碼解析
這篇文章主要為大家介紹了Spring?WebFlux怎么進(jìn)行異常處理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

