根據上文配置使用後 數據庫
會出現以下問題:this
this.jedis = this.jedisPool.getResource();方法長時間無響應且控制檯不報錯,方法堵塞。對象
實際狀況:事務
大概調用了該方法八九次以後就會開始堵塞,無響應。資源
緣由:相似數據庫鏈接池獲取事務或者IO流對象,用完以後須要關閉。 文檔
解決:每次使用完資源以後關閉資源,this.jedis.close()後便可。get
網上參考:it
jedisPool.getResource()方法長時間無響應而且不報錯,方法阻塞for循環
這個鍋真的是藍瘦,,,表現是項目重啓後一開始能夠,過段時間,哎,不行了,,,,查了一半天發現,緣由在於jedis鏈接用完了,而後默認給阻塞了,而後直到得到鏈接。看下個人錯誤代碼配置
//得到鏈接
Jedis jedis = jedisPool.getResource();
log.info("get jedis success");
jedis.set(wlId, encryUser);
jedis.expire(wlId,1800);
而後我跑了200個for循環,調用他,排查錯誤,大概就是到48次的時候,阻塞掉了,不報錯也沒反應,說明jedis鏈接池在我電腦配置上是開了48個之內。
查看他的官網文檔,其中有一段new JedisCluster(hpset, 30)中默認了MaxWaitMillis爲-1。,
BlockWhenExhausted:鏈接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true
MaxWaitMillis:獲取鏈接時的最大等待毫秒數(若是設置爲阻塞時
BlockWhenExhausted,若是超時就拋異常,小於零:阻塞不肯定的時間, 默認-1
BlockWhenExhauste這個方法默認參數-1,就是說當阻塞的時候我阻塞多久啊,默認永久阻塞。而一開始沒有阻塞是由於一開始鏈接並無耗盡,這個就是緣由所在。我們修改配置使得阻塞短期或者不阻塞或者在你用完jedis的時候關閉鏈接就行了啊,具體狀況視你的業務場景而定,我是把個人鏈接給關閉了。
修改後的代碼
//得到鏈接 Jedis jedis = jedisPool.getResource(); log.info("get jedis success"); jedis.set(wlId, encryUser); jedis.expire(wlId,1800); //用完後乖乖的關掉,就是由於它 jedis.close();