我使用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;
}}
答案 0 :(得分:3)
好像是超时问题。
请参阅此主题:Configure Jedis timeout
还有这个讨论:https://github.com/xetorthio/jedis/issues/185
所以我会尝试使用timeout参数实例化JedisPool
(即https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/JedisPool.java#L201,但还有许多其他构造函数)
并在redis中设置CONFIG SET timeout 600
(例如,超时为10分钟)。
JedisPool
超时以毫秒为单位。
答案 1 :(得分:1)
在尝试实现新的构造函数,池和客户端的新配置之后,我尝试了一种简单的方法来解决问题:关闭我从池中获取的资源。为此,我更改了以下代码:
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);
}
更改代码后,服务开始工作我正在计划中,所以我接受这个作为解决方案。