赞
踩
公司的一个项目上线后,由于该项目每天访问的人很多,并发也不小,在该项目上线运行半个月个后出现了 redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool的问题,然后通过重新构建暂时解决了,可是过了一个星期后又出现了同一个问题,后面通过分析有可能是jedis连接池配置的连接数小了,后面改成1000,过了半个月后还是出现同样的问题,接着又改了jedis的连接超时间最后也没有解决问题;项目这个问题持续了半年,最后通过查看jedis不同版本的连接池关闭断开的代码,发现了问题最终存在。
当时项目中使用的jedis版本是2.8.2,当时这个版本的连接关闭代码(Jedis.java):
public void close() {
if (this.dataSource != null) {
if (this.client.isBroken()) {
this.dataSource.returnBrokenResource(this);
} else {
this.dataSource.returnResource(this);
}
this.dataSource = null;
} else {
super.close();
}
}
jedis:2.10.2版本的jedis的close代码:
public void close() {
if (this.dataSource != null) {
Pool<Jedis> pool = this.dataSource;
this.dataSource = null;
if (this.client.isBroken()) {
pool.returnBrokenResource(this);
} else {
pool.returnResource(this);
}
} else {
super.close();
}
}
所以最后解决办法是升级jedis版本,因为2.10.2版本有jedis连接池泄露的问题
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.10.2</version>
</dependency>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。