我正在運行使用Jedis訪問Redis數據庫的Tomcat應用程序。形成整個應用程序塊的時間。通過使用JavaMelody監視Tomcat,我發現當對象請求Jedis實例時,問題似乎與JedisPool相關。Jedis正在耗盡資源實例,Web應用程序塊
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 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");
的JedisPoolConfig所以,很顯然有些線程試圖獲得一個Jedis實例,但該池是空的,所以默認池的行爲是等待不能返回一個實例。
我已經仔細檢查了我的整個代碼,我很確定我將每個Jedis實例返回到之前使用的池中。所以我不確定爲什麼我會耗盡實例。
有沒有辦法來檢查池中剩下多少實例?我試圖爲maxActive參數找到一個合理的值來防止應用程序被阻塞。
除了沒有將Jedis實例返回到池之外,是否還有其他方法可以創建內存空洞?
您是否設法解決此問題?我有完全相同的問題,正如你提到的,我很確定所有連接都返回了(我使用的是DAO模式,所以只有一個類使用Jedis)。提前致謝。 – pablochacin