【发布时间】:2014-02-09 09:59:33
【问题描述】:
我正在使用 Jedis 池来管理与 Redis 服务器的连接。我的一个示例代码如下:
public Set<String> getTopArticleList(int start, int end) {
Set<String> list = null;
Jedis j = JedisFactory.getInstance().getJedisPool().getResource();
Pipeline pipe = j.pipelined();
try {
// do stuff with redis
pipe.sync();
} catch (JedisConnectionException jex) {
JedisFactory.getInstance().getJedisPool().returnBrokenResource(j);
} finally {
JedisFactory.getInstance().getJedisPool().returnResource(j);
}
return list;
}
创建和检索 Jedis 池的代码:
class JedisFactory {
private static JedisPool jedisPool;
public JedisFactory() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
jedisPool = new JedisPool(
poolConfig,
RedisDBConfig.HOST,
RedisDBConfig.PORT,
RedisDBConfig.TIMEOUT,
RedisDBConfig.PASSWORD
);
}
public JedisPool getJedisPool() {
return jedisPool;
}
public static JedisFactory getInstance() {
if (instance == null) {
instance = new JedisFactory();
}
return instance;
}
}
问题是在达到限制连接数后,无法再访问网络。我做错了吗?
【问题讨论】:
-
能把JedisFactory的全部代码加进去吗?尤其是 getInstance() impl 和 getJedisPool()?
-
我添加了 JedisFactory 的完整代码
-
您使用 2 个或更多线程吗?可能是多线程问题?
-
我的应用是一个servlet web,当然还有多线程。
-
那么您应该保护您的 JedisFactory 和 JedisPool 实例,将它们设置为静态最终(使用急切实例化)或易失性(使用双重检查锁定 - 延迟实例化)。如果没有,每个线程都可以制作它的本地副本(为了性能),对象可以被实例化两次。因此,您可能在运行时有许多 JedisPool 实例,这些实例只是向您的 redis 服务器发送垃圾邮件,而没有足够的连接。
标签: java connection-pooling jedis