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)

我的应用程序将 Redis DB 与 Jedis 客户端一起使用。我有大约 2K 请求/秒。几个小时后,每个线程都在等待。

会不会是 DBCP 问题?有没有其他方法可以使用 Redis / Jedis 创建连接池?

谢谢

4

1 回答 1

3

这可能是由于使用默认的whenExhaustedAction设置导致的,该设置将阻塞(调用 Object.wait()),直到有新的或空闲的对象可用。在此处检查 javadoc 。

您可能需要增加maxActive值或设置适当的maxWait

正如@xetorthio 提到的,您必须通过以下方式返回绝地资源:

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 回答