JedisPool的close()方法执行后回收连接问题初探

自Jedis3.0版本后jedisPool.returnResource()遭弃用,官方重写了Jedis的close方法用以代替

官方建议应用redis.clients.jedis#Jedis的close方法进行资源回收

close()源码如下:


正常连接的回收,走的是3409行的returnResource(this)方法

而实际上这个方法也是被弃用了的


先不扯这些,过时就过时吧 ,我们往下看。

关闭方法里面,主要有这样一个标志的修改


从ALLOCATED(分配)状态改为了RETURNING(归还)状态,但是,在使用这个连接的时候,并没有对这个状态进行校验!

也就是说,回收之后的连接,依然可以继续使用。

见下图:


如图所示,连接jedis被回收后,重新分配到了jedis10上面,地址是一样的。

而这两个连接都可以使用,并都可以获取到值!

疑问:

如果这样设计的话 ,一个连接A被分配出去了,收回之后对A的使用毫无影响。

那会造成一个连接,可能同时在被N个用户使用,会有问题的。

我不知道是我不能理解JedisPool设计的精妙,还是这本身就是一个糟糕的设计或者bug呢?

求教!谢谢!

ps:有人问 一个连接,同时在被N个用户使用,会有什么问题。

我其实并不清楚具体会造成哪些问题,同问这个!

但我知道,连接池的设计就是为了避免频繁创建连接的开销,如果可以一个连接大家一起用,我完全可以new 一个final的连接一直不关闭,为什么还用连接池呢?是吧

有人提供了官网的文档,但好像对本问题没有什么帮助,给大家参考一下


这个文档只是说明了,分配后不关闭连接会导致连接池变慢,超时会自动回收。

不理解,提了一个issue


我的issue被关闭了,如下


JedisPool是Redis官方推荐的Java客户端Jedis提供的连接池。在使用JedisPool连接池时,需要进行一些配置。以下是一些常见的配置项: 1. 主机和端口号:指定Redis服务器的主机地址和端口号。 2. 最大连接数:设置连接池中最大的可用连接数。 3. 最大空闲连接数:设置连接池中最大的空闲连接数。 4. 最小空闲连接数:设置连接池中最小的空闲连接数。 5. 连接超时时间:设置获取连接的超时时间。 6. 读取超时时间:设置读取数据的超时时间。 7. 连接测试:可以配置一个连接测试,定期检测连接的可用性。 下面是一个示例代码,展示如何进行JedisPool的配置: ```java JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(100); poolConfig.setMaxIdle(20); poolConfig.setMinIdle(5); poolConfig.setMaxWaitMillis(3000); JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379, 5000, "password"); ``` 这段代码中,我们使用JedisPoolConfig来配置连接池的参数,然后通过JedisPool构造函数创建一个Jedis连接池对象。其中,"localhost"和6379分别是Redis服务器的主机和端口号,5000是连接超时时间,"password"是连接Redis服务器所需的密码(如果有的话)。 当需要使用Redis操作时,可以通过jedisPool.getResource()获取一个Jedis连接对象,并使用完毕后,通过jedis.close()方法连接归还给连接池。 希望以上信息对您有所帮助!如果有任何其他问题,请随时提问。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值