我正在运行使用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