使用Jedis池时的管道破裂



我正在使用jedis在redis中执行大量插入/读取。REDIS服务器正在使用默认配置。当我开始使用几个线程时出现问题,例外是:

redis.clients.jedis.exceptions.jedisconnectionexception:java.net.socketException:pipe quebrado(写失败)

我已经搜索了很多有关此问题的问题,但找不到问题或解决的原因。我用来执行这些测试的代码如下:

public class RedisFacade {
private static RedisFacade instancia = null;
// Initialize the Connection
final JedisPoolConfig poolConfig = buildPoolConfig();
JedisPool pool = new JedisPool(poolConfig, "localhost");
Jedis jedis;
int i = 0;
private RedisFacade() {
}
public static RedisFacade getInstancia() {
    if (instancia == null) {
        instancia = new RedisFacade();
    }
    return instancia;
}
// retorna um cliente jedis da pool
public Jedis getDB() {
    if (jedis == null) {
        jedis = pool.getResource();
    }
    return jedis;
}
//inserting
public void insert(Document d) {
    String key = i + d.getString("date") + d.getString("time");
    String value = d.toString();
    this.getDB().set(key, value);
    i++;
}
//reading
public void read(String date, String time) {
    Object doc = this.getDB().get(i + date + time);
    i++;
    System.out.println(doc);
}
public void destroyPool() {
    this.pool.destroy();
}
private JedisPoolConfig buildPoolConfig() {
    final JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxTotal(1100);
    poolConfig.setMaxIdle(16);
    poolConfig.setMinIdle(16);
    poolConfig.setTestOnBorrow(true);
    poolConfig.setTestOnReturn(true);
    poolConfig.setTestWhileIdle(true);poolConfig.setMinEvictableIdleTimeMillis(Duration.ofSeconds(60).toMillis());
    poolConfig.setTimeBetweenEvictionRunsMillis(Duration.ofSeconds(30).toMillis());
    poolConfig.setNumTestsPerEvictionRun(3);
    poolConfig.setBlockWhenExhausted(true);
    return poolConfig;
}}

似乎是一个超时问题。

请参阅此线程:配置JEDIS超时

以及此讨论:https://github.com/xetorthio/jedis/issues/185

所以我将尝试使用超时参数实例化JedisPool(I.E. https://github.com/xetorthio/jedis/jedis/blob/master/src/src/main/java/java/redis/clients/jedis/jedispool.java#l201,但还有许多其他构造函数)

并在redis中设置CONFIG SET timeout 600(例如,超时时间为10分钟)。

编辑

JedisPool超时似乎以毫秒为单位。

尝试实现新的构造函数,池和客户端的新配置后,我尝试了一种简单的方法来解决问题:关闭从池中获得的资源。为此,我更改了以下代码:

public Jedis getDB() {
    jedis = pool.getResource();
    return jedis;
}
//cria um _id pra ser usado novamente quando for buscar os documentos
public void insert(Document d) {
    String key = "key" + i;
    String value = d.toString();
    Jedis jedis = this.getDB();
    jedis.set(key, value);
    jedis.close();
    i++;
}
//busca pelo _id
public void read() {
    Jedis jedis = this.getDB();
    Object doc = jedis.get("key" + i);
    jedis.close();
    i++;
    System.out.println(doc);
}

更改代码后,服务开始工作,我正在计划,所以我将接受此解决方案。

最新更新