最近在开发的企业在线培训和考试系统,开发中用到redis缓存,由于第一次用遇到了不少问题。而且网上的资料都不是很正规统一,查看资料和问题都是很零散。
一个月以前,开发中redis出现了“err max number of clients reached”,项目启动失败。当时我重启了项目,修改了redis的最大连接数为无限制,以为问题很简单。
现在一个月以后,问题又出现了,项目组的开发人员项目都启动失败报错,我认为这个问题需要重视下,如果投产了,问题再出现就麻烦了。
在网上查看大量的资料,还是找不到解决办法。因为项目平时不报错,用了一个月左右的时间,问题再次出现,肯定是一个长期使用压力造成的问题。
最后和同事讨论,经同事提醒才发现是redis连接池在关闭项目的时候,需要收回连接池,不然redis在开发的过程中,所有开发人员本地项目连接redis服务器,经常重启项目会累积很多不能释放的连接,
代码如下:
<bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="testWhileIdle" value="true"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
<constructor-arg ref="jedisConfig" />
<constructor-arg value="localhost" />
<constructor-arg type="int" value="6379" />
</bean>
其中 destroy-method="destroy",是关闭web容器的时候,会调用连接池的destroy,关闭和redis的连接,就此隐藏两个月的问题终于解决了。