最近在開發的企業在線培訓和考試系統,開發中用到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的連接,就此隱藏兩個月的問題終於解決了。