绝地:断管

时间:2015-01-09 02:22:28

标签: java database redis jedis

所以,我有两个使用jedis的应用程序。它们都连接到同一个服务器,并且一个侦听发布以检查是否写入了某些内容。好吧,经过大约10个小时的连续使用和加载,设置/获取/发布/发布后,jedis返回Broken Pipe。我不知道为什么,因为我在jedis中超时为0。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

根据我的发现,Jedis保持与Redis的开放连接,并且不检查这些连接的状态。如果连接在空闲时间中断(网络重置或暂时断开连接或连接超时),Jedis连接池将基本无效,但Jedis客户端将不会报告,直到您尝试向管道发送命令。 以下是关于github的讨论:https://github.com/xetorthio/jedis/issues/185

我解决这个问题的方法是在发送任何数据之前发送“ping”:

private Jedis getResource() {
    Jedis jedis;
    try{
        jedis = pool.getResource();
        jedis.ping();
    } catch (JedisException e) {
        pool.destroy();
        pool = getPool(this.url);
        jedis = pool.getResource();
    }
    return jedis;
}

public String get(EphemeralKey key, EphemeralLocation location) throws Exception {
    String encodedKey = encodeKey(key, location);
    try (Jedis jedis = getResource()) {
        return jedis.get(encodedKey);
    } catch (JedisException e) {
        throw wrapJedisException(e);
    }
    return null;
}