当前位置: 首页 > 知识库问答 >
问题:

使用Jedis泳池时管道破裂

华星文
2023-03-14

我正在使用Jedis在Redis中执行大量的插入/读取。Redis服务器正在使用默认配置。当我开始使用几个线程时,问题出现了,异常情况是:

redis.clients.jedis.exceptions.JedisConnection异常:java.net.Socket异常: 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;
}}

共有2个答案

薛欣德
2023-03-14

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

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

更改代码后,我计划的服务开始工作,所以我接受这个解决方案。

都才俊
2023-03-14

似乎是超时问题。

查看以下线程:配置绝地超时

还有这个讨论:https://github.com/xetorthio/jedis/issues/185

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

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

超时似乎以毫秒为单位。

 类似资料:
  • 游泳指标可以帮您分析每次的游泳训练,并长期追踪您的表现和进步。该指标记录了您的游出距离、时间和速度、划水频率,还可以辨别您的游泳风格。另外,有了SWOLF分数,您可以提高游泳技术。 如需获取最准确的信息,请确保您已经对佩戴 M600 的手作了设定。该设定可以在Polar Flow应用程式中Devices(设备) > Polar M600下进行,或在Polar Flow网络服务中您的姓名/简介图片

  • 我有一个非常奇怪的问题,我希望你的眼睛能帮助解决它。 我定义了一个函数,它通过BASH连接到Oracle SQL数据库。连接后,我使用一个herdeoc传入一个简单的select语句,该语句查找最大订阅id并递增它,具体取决于函数被调用的次数。代码如下: 在命令行调用函数时,上述代码非常有效: 但是,当函数通过管道传输到AWK语句时,函数不再抖动,这毫无意义!请参阅下面的输出: 我不明白。哈哈,我

  • 问题内容: 在使用selenium(没有远程,没有xvfb)运行django测试时,我总是得到以下异常: 使用django 1.4和带有Firefox WebDriver的seleniumpython-bindings 2.28.0在LiveServerTestCase上运行测试。有人对如何解决有想法吗? 问题答案: 确保请求页面的浏览器正在等待响应。 如果我没记错的话,有和命令,请确保您正在使用

  • 传递参数 链接管道 我们可以将多个管道连接在一起,以便在一个表达式中使用多个管道。

  • 我正在对一个由zuul代理服务支持的简单Spring云应用程序进行一些压力测试。由于Zuul和服务之间的旧连接,我们偶尔会出现管道异常。我使用不同的配置选项配置Zuul,但没有成功: 例外情况如下: 通用域名格式。netflix。祖尔。例外ZuulException:组织转发错误。springframework。云netflix。祖尔。过滤器。路线RibbonRoutingFilter。转发(Ri

  • 我们将我们的集群迁移到Cassandra 1.2(从1.1.7),并尝试在迁移后运行修复(我们按照建议定期运行它们)。 由于SSTable版本不同,修复失败,因此我们使用和并重试。 但是,修复失败了,但有这个例外: 我们还注意到,在死亡之前,< code>nodetool netstats显示了奇怪的统计数据(表传输为756845%...). 编辑 这似乎是压缩SSTables传输的问题,我将尝试