redis - 为什么JedisPool得到的Jedis对象在使用完毕后需要手动关闭连接?
PHPz
PHPz 2017-04-27 09:03:48
0
1
1693

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

<bean id="jedisPoolConfig" 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 id="jedisPool" 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所有的方法都单独进行一次封装,在封装的代码里面进行关闭连接,难道没有其他好的办法了吗?

PHPz
PHPz

学习是最好的投资!

reply all(1)
小小卫

No more Doudou, no more Doudou, no more Doudou, no more Doudou, no more Doudou, no more Doudou, no more Doudou, no more Doudou, no more Doudou, no more Doudou, no more

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template