- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
使用 Tomcat 运行网络应用程序。我使用 jedis 连接到我们的 redis 服务器。
我使用的每个方法都是在 finallay block 中调用 jedis.close()但看起来没有将 jedis 资源返回到池中。
使用
netstat -atnlp|grep 6379
连接数在不断增长。直到 jedis 客户端抛出“JedisConnectionException:无法从池中获取资源”。我调试代码。 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方法,再次dump。运行相同的 OQL,找到 25 个 jedis 对象。
也许此信息有帮助。
最佳答案
在我最后一条评论之后,我怀疑您的代码可能会调用您的实用程序的 setExpire
方法。请注意,这是唯一一个您分配资源但仅在出现异常时关闭它的资源,而不是在 finally
block 中。
尝试改变你的实现
@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();
}
}
关于java - 为什么不能在tomcat上使用jedis池释放jedis资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33967361/
我有一个 tomcat 服务器并使用 jedis 客户端连接到它。 我使用的jedis版本是“3.0.0-m1”,tomcat 8.0.15 连接后几个小时后,我看到以下异常。有什么帮助吗? redi
我正在使用 Jedis 连接到 Redis 并将数据推送到列表中。我正在为 JSON 数据使用 rpush。 这些是我执行的步骤: 从 Rabbitmq 获取数据 从 JSON 数据中收集信息并准备一
我正在尝试在 vim 中使用 python-jedi,但目前它完全无法使用,因为它试图在奇怪的时间完成代码。 我添加了以下行: let g:jedi#popup_on_dot = 0 到我的 vim
我正在使用 jedi-vim,输入以下内容后,出现“未找到模式”错误: import numpy numpy. 但是,如果我运行以下 python 脚本,我会得到一长串完成列表: import jed
以下 Java 代码将一百万对整数插入到 Redis 中。 public class JedisInsertion { public static byte[] fromInt(in
我在几个线程中看到了答案,但没有解决我的问题,因为我的问题偶尔会出现,如果有人有任何想法,请问这个问题。 我使用的是jedis 2.8.0版本,Spring Data redis 1.7.5版本。和用
我的 Storm 类使用 Redis 队列来收集数据。 我尝试运行我的 Storm jar storm jar jar_file_name.jar Topology_name configuratio
我通过 jedis 在 java 上有这段代码: int shb1 = jds.storeHypnoBeats(id1, arr1); 调用这个函数: int storeHypnoBeats(Stri
我是 jedi-vim 的新手,我不知道如何跳转其他文件中的函数定义。 jedi-vim 's doc是: 以下是其中的一部分: NOTE: subject to change! let g:jedi
我刚刚注意到,每当我对任何 Delphi 2010 项目进行增量编译 (ctrl-F9) 时,我的项目中引用的所有 JEDI 单元都会重新编译,尽管它们没有以任何方式进行更改。事实上,如果我创建一个新
我正在使用 Jedi usb hid 组件连接 HID 设备并对其进行读取和写入。我无法写入设备。我一直在使用这个代码。 type TReport = Packed record ReportID:
我正在使用 Jedis,我无法直接连接到 Redis,我必须使用代理。我可以使用 socks 代理通过 Jedis 连接到 Redis 吗? 请你帮帮我。 问候。 最佳答案 我一直在寻找解决方案,但找
我在 vim 中通过 YCM 使用 jedi,在我的项目中看到一些奇怪的行为,关于在 jediHttp 服务器上使用 usages 端点。基本上它只能找到我项目中类或函数的一小部分用法。它确实找到了当
我正在尝试连接到我的虚拟机 Redis package nosql; import redis.clients.jedis.Jedis; public class NoSQL { public sta
我在我用作生产者/消费者队列的 Redis 队列之上使用 Java 库 Jedis。它易于设置并且运行良好。 消费者代码如下 List messages = jedis.blpop(0, redisQ
什么是jedis事务执行成功响应? jedis 似乎会返回 1 作为成功响应。如果交易包括两个操作,我的以下代码是否有效? List ret = jedisAdapter.exec(tx, jedi
我在看jedis源码的时候发现 connection = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(key))
我在 jedis 客户端的帮助下使用 redis。在此处附加键值设置/获取的代码片段。在这里,我希望我的 jedisPool 只被初始化一次,但它被初始化了多次。不知道我哪里错了。用它挠我的头几天。我
当我像下面的代码一样使用 jedis 时: public class JedisTest extends Sync { private static final String _SET_KEY
我最近不得不使用 Jedis 库,它是一个很棒的库。我知道 Redis 是用 C 编写的,Jedis 只是将 Java 包装在 C 周围吗?光看Jedis源码是想不通的。谁能解释一下? 最佳答案 Je
我是一名优秀的程序员,十分优秀!