Broken pipe while using Jedis Pool

11,013

Solution 1

After trying to implement new constructors, new configurations for the pool and clients, I tried a simple way to fix the problem: close the resources I was getting from the pool. To do so, I've changed the following code:

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);
}

After changing the code, the service started to work I was planning, so I'll accept this as a solution.

Solution 2

Seems like it's a timeout issue.

See this thread: Configure Jedis timeout

And also this discussion: https://github.com/xetorthio/jedis/issues/185

So I would try instantiating JedisPool with a timeout parameter (i.e. https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/JedisPool.java#L201, but there are many other constructors)

and setting CONFIG SET timeout 600 in redis (with a 10 minute timeout for instance).

Edit

The JedisPool timeout is in milliseconds it seems.

Share:
11,013
Allexandre S.
Author by

Allexandre S.

Updated on June 04, 2022

Comments

  • Allexandre S.
    Allexandre S. almost 2 years

    I'm using Jedis to perform a lot of insertions/reads in Redis. The Redis server is using the default configuration. The problem appears when I start using a few threads and the exception is:

    redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Pipe quebrado (Write failed)

    I've searched a lot about this problem but couldn't find the reason of it or it's solve. The code I'm using to perform these tests is below:

    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;
    }}