日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jedisPool.getResource()方法长时间无响应并且不报错

發布時間:2024/2/28 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()方法长时间无响应并且不报错的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。