2012-08-15 32 views
1

我有以下問題<5c1a77ba>(一org.apache.commons.pool.impl.GenericObjectPool $鎖存器):的Redis/Jedis - Tomcat的掛 - - 等待

我的Tomcat掛着以下線程轉儲:

"ajp-bio-28109-exec-1589" - Thread [email protected] 
    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的連接池?

由於

+1

您是否在使用它們之後將資源返回到池中?似乎池已經耗盡,因爲它掛在「borrowObject」方法中。 – xetorthio 2012-08-15 22:37:34

回答

3

這可能是因爲通過使用默認引起whenExhaustedAction設置這將阻止(調用的Object.wait()),直到一個新的或空閒的對象是可用的。檢查javadoc here

您可能需要增加數值或設置適當的maxWait

而作爲@xetorthio提到的,你必須在所做返回jedis reources:

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(); 

希望這有助於。