jedisPool.getResource()方法长时间无响应并且不报错
生活随笔
收集整理的這篇文章主要介紹了
jedisPool.getResource()方法长时间无响应并且不报错
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一個Java Web的系統需要動態根據Redis地址獲取數據,截取相關代碼如下:
獲取連接的方法:
public static JedisCluster getConn(String host, int port){String key = getKey(host, port);JedisCluster jedisCluster = (JedisCluster)jedisConnMap.get(key);if (jedisCluster == null) {try {LOG.debug("jedisCluster is empty.");HostAndPort hostAndPort = new HostAndPort(host, port);Set hpset = Sets.newHashSet(new HostAndPort[] { hostAndPort });jedisCluster = new JedisCluster(hpset, 30);} catch (JedisException e) {LOG.error("create jediscluster error: {}", e);}if (jedisCluster != null) {jedisConnMap.put(key, jedisCluster);}}return jedisCluster;}調用的代碼塊:
JedisCluster jedisCluster = JedisConnCacheUtil.getConn(host, port); if (jedisCluster == null) {LOG.debug("get jedisCluster error.");return; } Map jedisPools = jedisCluster.getClusterNodes(); for (String jedisAdr : jedisPools.keySet()){JedisPool jedisPool = (JedisPool)jedisPools.get(jedisAdr);Jedis jedis = jedisPool.getResource();//后面是對Jedis的具體操作 }由于調用的代碼是跑在一個定時任務里,出現的異常情況是,前幾次數據都可以正常獲取,大約幾分鐘后,定時任務就沒有運行了,也沒有任何報錯。
通過捕獲JVM ThreadDump,發現有一個線程在Jedis jedis = jedisPool.getResource()這行一直waiting。
也就是這行代碼長時間無響應阻塞了整個定時任務。很奇怪,如果無法獲取Resource應該也要報錯,可是什么也沒有。
查詢了官方文檔,原來new JedisCluster(hpset, 30)中默認了MaxWaitMillis為-1。
BlockWhenExhausted:連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true
MaxWaitMillis:獲取連接時的最大等待毫秒數(如果設置為阻塞時BlockWhenExhausted),如果超時就拋異常,小于零:阻塞不確定的時間, 默認-1
由于BlockWhenExhausted默認為true,連接耗盡時會阻塞到超時,但是MaxWaitMillis默認為-1,超時時間是一個不確定的時間,所以就一直阻塞著了。
修改配置后問題解決。
總結
以上是生活随笔為你收集整理的jedisPool.getResource()方法长时间无响应并且不报错的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leet Code OJ 125. Va
- 下一篇: Leet Code OJ 14. Lon