redis - 为什么JedisPool得到的Jedis对象在使用完毕后需要手动关闭连接?

【字号: 日期:2022-08-21浏览:51作者:雯心

问题描述

jedis使用的单节点模式,集成spring配置如下:

<bean class='redis.clients.jedis.JedisPoolConfig'> <property name='maxTotal' value='600' /> <property name='maxIdle' value='300' /> <property name='maxWaitMillis' value='1000' /> <property name='testOnBorrow' value='true' /></bean> <bean class='redis.clients.jedis.JedisPool'> <constructor-arg index='0' ref='jedisPoolConfig' /> <constructor-arg index='1' value='127.0.0.1' /> <constructor-arg index='2' value='6379' type='int' /> <constructor-arg index='3' value='60000' type='int' /> <constructor-arg index='4' value='123456'/></bean>

工具代码如下:

@Resource private JedisPool jedisPool; @Override public Jedis getJedis() {return jedisPool.getResource(); }

业务代码如下:

for(int i = 2000; i<3000; i++) { Jedis jedis = redisDao.getJedis(); jedis.set('user:' + i, jedis.toString()); System.out.println(jedis); set.add(jedis.toString());}

在上面的代码中,当循环到600次的时候,就会报出拿不到连接的错误,而600恰好是配置中的连接个数;并且jedis连接不会在使用结束后进行释放(因为报错后,再次请求这个方法,连一个连接都拿不到了)。

如果在代码的循环中加入

jedis.close();

则效果就不一样了,可以循环结束,并且打印的jedis对象是同一个连接地址。

这种情况下,要么在业务代码层使用结束后进行关闭,要把jedis所有的方法都单独进行一次封装,在封装的代码里面进行关闭连接,难道没有其他好的办法了吗?

问题解答

回答1:

没豆豆了 打扰了没豆豆了 打扰了没豆豆了 打扰了没豆豆了 打扰了没豆豆了 打扰了没豆豆了 打扰了没豆豆了 打扰了

相关文章: