为什么无法在 tomcat 上使用 jedis 池释放 jedis 资源
WHY Can't release jedis resource using jedis pool on tomcat
使用 Tomcat 到 运行 网络应用程序。
我使用 jedis 连接到我们的 redis 服务器。
我使用的每个方法都是在 finallay 块中调用 jedis.close()
但看起来 return jedis 资源没有到池中。
使用
netstat -atnlp|grep 6379
连接数稳步增长。直到 jedis 客户端抛出 "JedisConnectionException: Could not get a resource from the pool."。我调试代码。 jdeis.close() 是 运行.
我的代码有问题吗?
帮帮我,这已经让我们的服务器宕机很多次了。
这是我的 jedis pom conf
<!-- jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
tomcat 是
apache-tomcat-7.0.64
服务器是
Centos 6.5
redis 是
v2.8.11
Spring版本:
3.2.13.RELEASE
这是我的 JedisUtils 代码:
@Service(value = "redisCacheService")
public class RedisCacheServiceImpl implements CacheService {
/**
* redis Version No.
*/
private static final String VERSION = "000";
private static JedisPool pool;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(500);
config.setMaxIdle(5);
config.setMaxWaitMillis(1000 * 10);
config.setTestOnBorrow(true);
pool = new JedisPool(config, "10.10.65.10", 6379);
}
@Override
public int set(
String key,
String value) {
Jedis jedis = pool.getResource();
try {
return jedis.set(VERSION + "|" + key, value).equals("OK") ? 1 : 0;
} finally {
jedis.close();
}
}
@Override
public int set(
String key,
String value,
int seconds) {
Jedis jedis = pool.getResource();
try {
return jedis.setex(VERSION + "|" + key, seconds, value).equals("OK") ? 1 : 0;
} finally {
jedis.close();
}
}
@Override
public String get(
String key) {
Jedis jedis = pool.getResource();
try {
return jedis.get(VERSION + "|" + key);
} finally {
jedis.close();
}
}
@Override
public int del(
String key) {
Jedis jedis = pool.getResource();
try {
return Integer.valueOf(jedis.del(VERSION + "|" + key).toString());
} finally {
jedis.close();
}
}
@Override
public void setExpire(
String key,
int expireTime) {
Jedis jedis = pool.getResource();
try {
jedis.expire(key, expireTime);
} catch (Exception e) {
jedis.close();
}
}
}
更多信息:
2015-11-28 19:58:50
现在redis服务器的连接数还在增长。
使用 jmap 转储所有堆信息,运行 jvisualvm 上的 OQL:
select x from redis.clients.jedis.Jedis x
然后我找到了24个jedis对象
然后我在同一个tomcat服务器上再次调用jedis方法,再次转储。 运行同样的OQL,找到了25个jedis对象
也许此信息有帮助。
在我发表最后一条评论之后,我怀疑您的代码可能会调用您的实用程序的 setExpire
方法。请注意,这是唯一一个您分配资源但仅在出现异常时关闭它的资源,而不是在 finally
块中。
尝试更改您的实施方式
@Override
public void setExpire(
String key,
int expireTime) {
Jedis jedis = pool.getResource();
try {
jedis.expire(key, expireTime);
} catch (Exception e) {
jedis.close();
}
}
到
@Override
public void setExpire(
String key,
int expireTime) {
Jedis jedis = pool.getResource();
try {
jedis.expire(key, expireTime);
} finally {
jedis.close();
}
}
使用 Tomcat 到 运行 网络应用程序。 我使用 jedis 连接到我们的 redis 服务器。
我使用的每个方法都是在 finallay 块中调用 jedis.close() 但看起来 return jedis 资源没有到池中。
使用
netstat -atnlp|grep 6379
连接数稳步增长。直到 jedis 客户端抛出 "JedisConnectionException: Could not get a resource from the pool."。我调试代码。 jdeis.close() 是 运行.
我的代码有问题吗?
帮帮我,这已经让我们的服务器宕机很多次了。
这是我的 jedis pom conf
<!-- jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
tomcat 是
apache-tomcat-7.0.64
服务器是
Centos 6.5
redis 是
v2.8.11
Spring版本:
3.2.13.RELEASE
这是我的 JedisUtils 代码:
@Service(value = "redisCacheService")
public class RedisCacheServiceImpl implements CacheService {
/**
* redis Version No.
*/
private static final String VERSION = "000";
private static JedisPool pool;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(500);
config.setMaxIdle(5);
config.setMaxWaitMillis(1000 * 10);
config.setTestOnBorrow(true);
pool = new JedisPool(config, "10.10.65.10", 6379);
}
@Override
public int set(
String key,
String value) {
Jedis jedis = pool.getResource();
try {
return jedis.set(VERSION + "|" + key, value).equals("OK") ? 1 : 0;
} finally {
jedis.close();
}
}
@Override
public int set(
String key,
String value,
int seconds) {
Jedis jedis = pool.getResource();
try {
return jedis.setex(VERSION + "|" + key, seconds, value).equals("OK") ? 1 : 0;
} finally {
jedis.close();
}
}
@Override
public String get(
String key) {
Jedis jedis = pool.getResource();
try {
return jedis.get(VERSION + "|" + key);
} finally {
jedis.close();
}
}
@Override
public int del(
String key) {
Jedis jedis = pool.getResource();
try {
return Integer.valueOf(jedis.del(VERSION + "|" + key).toString());
} finally {
jedis.close();
}
}
@Override
public void setExpire(
String key,
int expireTime) {
Jedis jedis = pool.getResource();
try {
jedis.expire(key, expireTime);
} catch (Exception e) {
jedis.close();
}
}
}
更多信息: 2015-11-28 19:58:50
现在redis服务器的连接数还在增长。
使用 jmap 转储所有堆信息,运行 jvisualvm 上的 OQL:
select x from redis.clients.jedis.Jedis x
然后我找到了24个jedis对象
然后我在同一个tomcat服务器上再次调用jedis方法,再次转储。 运行同样的OQL,找到了25个jedis对象
也许此信息有帮助。
在我发表最后一条评论之后,我怀疑您的代码可能会调用您的实用程序的 setExpire
方法。请注意,这是唯一一个您分配资源但仅在出现异常时关闭它的资源,而不是在 finally
块中。
尝试更改您的实施方式
@Override
public void setExpire(
String key,
int expireTime) {
Jedis jedis = pool.getResource();
try {
jedis.expire(key, expireTime);
} catch (Exception e) {
jedis.close();
}
}
到
@Override
public void setExpire(
String key,
int expireTime) {
Jedis jedis = pool.getResource();
try {
jedis.expire(key, expireTime);
} finally {
jedis.close();
}
}