Jedis を使用して Redis データベースにアクセスする Tomcat アプリケーションを実行しています。時々、アプリケーション全体がブロックされます。JavaMelody を使用して Tomcat を監視したところ、オブジェクトが Jedis インスタンスを要求したときに、問題が JedisPool に関連しているように見えることがわかりました。
catalina-exec-74
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:503)
org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
redis.clients.util.Pool.getResource(Pool.java:20)
....
これは私が使用している JedisPoolConfig です
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxActive(20);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setMaxIdle(5);
poolConfig.setMinIdle(5);
poolConfig.setTestWhileIdle(true);
poolConfig.setNumTestsPerEvictionRun(10);
poolConfig.setTimeBetweenEvictionRunsMillis(10000);
jedisPool = new JedisPool(poolConfig, "localhost");
したがって、明らかに一部のスレッドは Jedis インスタンスを取得しようとしますが、プールが空でインスタンスを返すことができないため、デフォルトのプール動作は待機です。
私はすでにコード全体を再確認しており、すべての Jedis インスタンスを以前に使用したプールに戻したと確信しています。そのため、インスタンスが不足している理由がわかりません。
プールに残っているインスタンスの数を確認する方法はありますか? アプリケーションがブロックされないように、maxActive パラメータの適切な値を見つけようとしています。
Jedis インスタンスをプールに戻さない以外に、メモリ ホールを作成する方法はありますか?