1

次の問題があります。

Tomcat が次のスレッド ダンプでハングします。

"ajp-bio-28109-exec-1589" - Thread t@1713
   java.lang.Thread.State: WAITING
                at java.lang.Object.wait(Native Method)
                - waiting on <5c1a77ba> (a org.apache.commons.pool.impl.GenericObjectPool$Latch)
                at java.lang.Object.wait(Object.java:503)
                at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1118)
                at redis.clients.util.Pool.getResource(Pool.java:24)

私のアプリケーションは、Jedis クライアントで Redis DB を使用します。1 秒あたり約 2K のリクエストがあります。数時間後、すべてのスレッドが待機しています。

それはDBCPの問題でしょうか?Redis / Jedis で接続プールを作成する他の方法はありますか?

ありがとう

4

1 に答える 1

3

これはおそらく、新しいオブジェクトまたはアイドル状態のオブジェクトが利用可能になるまでブロック (Object.wait() を呼び出す) するデフォルトのwhenExhaustedAction設定を使用したことが原因でした。ここでjavadocを確認してください。

maxActive値を増やすか、適切なmaxWaitを設定する必要がある場合があります。

そして、@xetorthio が述べたように、次の方法で完了したら、jedis のリソースを返す必要があります。

Jedis jedis = pool.getResource();
try {
  /// ... do stuff here ... for example
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  Set<String> sose = jedis.zrange("sose", 0, -1);
} finally {
  /// ... it's important to return the Jedis instance to the pool once you've finished using it
  pool.returnResource(jedis);
}
/// ... when closing your application:
pool.destroy();

お役に立てれば。

于 2012-10-26T07:51:01.000 に答える