您的位置:首页 > 数据库 > Redis

jedisPool中的jedis实例被还回后是否会断开和redis服务端的socket连接

2015-09-11 15:59 621 查看
昨天开技术交流会,谈到NIO的socket时,我们联想到了redis连接也用的socket,这点我赞同,可是突然某前辈说在完成一个操作后将jedis实例return给jedispool时,会将该实例和redis的连接断开。。。。。。听到这我就郁闷了。

我觉得啊,无论是数据库连接池,还是redis连接池,只要是连接池,它的思想就是事先准备一些连接,供有客户端进行操作的时候可以直接读写,而不需要再次建立连接。因为建立连接是个昂贵的操作,会耗费相当到一部分时间,甚至一次数据读写,大部分的时间都花在了建立连接上前辈的这个结论明显违背了连接池的设计思想,口说无凭,用源码说话。扒了半天源码,终于找到了姑且能作为证据的证据吧:

jedispool的配置项中有TestOnBorrow、TestOnReturn这两个,意思是在borrow和return jedis实例的时候是否要对实例进行检查,以TestOnReturn的为例,方法在redis.clients.jedis.JedisPool的内部类JedisFactory中,源码如下:

public boolean validateObject(final Object obj) {
if (obj instanceof Jedis) {
final Jedis jedis = (Jedis) obj;
try {
return jedis.isConnected() && jedis.ping().equals("PONG");
} catch (final Exception e) {
return false;
}
} else {
return false;
}
}
在Borrow和return的时候检查用的都是validateObject()方法,都是去检验一下jedis实例和redis服务端的连接是否正常,在return的时候,如果jedis实例和redis已经断开了连接,这个实例则会被drop,不会返还到pool中。
前辈,这次不好意思了!偷笑中。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jedispool 保持连接