Redis異常狀況分析

咱們沒有正確對待這個SocketTimeoutException異常,即一旦出現SocketTimeoutException異常,咱們是必需要廢棄掉這個Jedis的。因此對於單線程環境下的Jedis來講,一旦出現這種異常,咱們須要從新new一個新的Jedis來使用。html

 

Jedis在內部執行出現異常,如SocketTimeoutException異常的時候,會標記一個boolean broken=true,即意味着該鏈接已經廢棄了。多線程

重要的大坑在這裏,咱們一般使用JedisPool來應對多線程環境下Jedis的使用,通常使用方式以下:.net

Jedis jedis = null;//從pool中獲取資源 try{ jedis = pool.getResource(); jedis.set("k1", "v1"); }catch(Exception e){ e.printStackTrace(); }finally{ if(jedis != null){ pool.returnResource(jedis);//向鏈接池「歸還」資源,千萬不要忘記。 } }線程

而對於JedisPool,咱們會使用returnResource方法來向pool中釋放回Jedis,而這個returnResource卻忽視了上述boolean broken屬性,直接將一個標記廢棄的鏈接放回到了pool中,下次別人取的時候,必然出問題。htm

 

http://www.open-open.com/lib/view/open1454502890526.htmlblog

http://blog.csdn.net/moxiaomomo/article/details/17588483資源

相關文章
相關標籤/搜索