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资源

相关文章
相关标签/搜索