Spring統合redis RedisTemplateを使用したピットCould not get a resource from the pool

1846 ワード


一、背景
プロジェクトではspringフレームワークを使用してredisを統合し、フレームワークパッケージのRedisTemplateを使用してデータの削除・変更を実現し、プロジェクトがオンラインになった後、しばらく実行した後、異常Could not get a resource from the poolが発生することを発見した.最初はredisの最大接続数が足りないと思っていたので、ひたすら最大接続数を増やして、何度か試してみると、やはり異常を報告していました:Could not get a resource from the pool.しかし、接続プールには明らかにリンクがあり、この問題は、リソースプールの接続数が設定された最大接続数より大きい場合に発生します.最後に接続が解放されていないのではないかと疑った.soネットで検索して、この問題を解決しました.
Caused by: redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool
	at redis.clients.util.Pool.getResource(Pool.java:51)
	at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
	at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16)
	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:191)
	... 86 more
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
	at redis.clients.util.Pool.getResource(Pool.java:49)
	... 89 more

 
二、解決
問題のポイントは、redisのプロファイルでenableTransactionSupportの設定です.
1、enableTransactionSupport = false .この場合redisは物事をサポートしません.RedisTemplateは使用が終わった後、自動的に接続を解除します.
2、enableTransactionSupport = true .このときredisは物事を支持する.RedisTemplateでは、接続をアクティブに解除することはできません.手動で接続を解除する必要があります.この問題は、Sping Data Redisがトランザクションを使用している場合、接続を閉じない問題を参照してください.
redisTemplate.exec();
RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());

 
三、付録
アリクラウドredisの一般的な異常ドキュメントを添付します
1、Jedisのよくある異常のまとめ
2、JedisPool資源プールの最適化