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