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中,源码如下:
前辈,这次不好意思了!偷笑中。。。。。。
我觉得啊,无论是数据库连接池,还是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中。
前辈,这次不好意思了!偷笑中。。。。。。
相关文章推荐
- Jedis出现connection timeout问题解决方法(JedisPool连接池使用实例)
- reids使用
- ssh 代理 on linux
- HTTP协议客户端和服务器交互的三次握手、持续连接、断开连接过程
- Jedis连接池的使用
- Redis2.8 单个redis JedisPool 与spring的集成配置
- JedisSentinelPool的相关配置与操作
- Redis入门Jedis
- redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
- java操作redis redis连接池
- redis池简单实现
- 彻底解决 Jedis 连接池 获取不到连接,连接放回连接池错误的问题
- Redis单机集群配置和java客户端
- jedisPool相关参数说明
- jedis还给连接池后,设置还存在吗?
- JedisPool工具类及使用
- 【Redis】Java实现消息队列
- 通过JedisPool整合redis
- Netty发送心跳 保持连接
- 一些常用的小玩意之redis