提问者:小点点

HikariCP连接突然失效


嗨Stackoverflow家族,

所以我们有一个静态编程语言的应用程序

假设Hikari中一切正常,连接关闭并根据默认为30分钟的maxliftime添加,日志如下所示:

  • HikariPool-1-池统计信息(总计=40,活动=0,空闲=40,等待=0)
  • HikariPool-1-填充池跳过,池处于足够的水平。

突然间,大多数连接都失效了。假设40个中的30个。连接在超过最大生命周期之前就关闭了,所有关闭的连接的日志如下所示:

  • HikariPool-1-无法验证连接org.postgresql.jdbc.PgConnection@5257d7b2(此连接已关闭。)。可能考虑使用较短的maxLifetime值。
  • HikariPool-1-关闭连接org.postgresql.jdbc.PgConnection@7b673105:(连接已死)

此外,在这些消息之后,后跟多个此日志,如下所示:

  • 添加连接省略,等待6,队列13

超时失败统计如下:

  • HikariPool-1-超时失败统计信息(总计=12,活动=12,空闲=0,等待=51)

最后,由于大多数请求没有可用的连接,我留下了很多请求的连接超时:

  • java. sql.SQLTranentConnectionException:HikariPool-1-连接不可用,请求超时超过30000ms

我添加了泄漏检测阈值,在问题发生期间它也会像下面这样记录:

  • 为线程超文本传输协议-nio-8080-exec-482上的org.postgresql.jdbc.PgConnection@3bb5f155触发连接泄漏检测,堆栈跟踪如下
  • java. lang.Exception:检测到明显的连接泄漏

hikari配置如下:

hikari:
  data-source-properties: stringtype=unspecified
  maximum-pool-size: 40
  leak-detection-threshold: 30000

当这个问题发生时,PostgreSQL中的查询也需要大量时间:8-9秒,最多增加15-35秒。有些查询甚至55-65秒(通常在平时最多需要1-3秒)。这就是为什么我们认为这不是查询问题。

然而,除了一些消息来源建议使用try与资源之外,我们的情况并非如此,因为我们不手动获取连接。此外,将最大池大小从20增加到40也没有帮助。我非常感谢任何评论或提示,因为我们已经处理这个问题将近一周了。


共1个答案

匿名用户

原因可能是您在Postgres端设置了idle_session_timeout,或者系统中其他一些连接超时时间小于maxLifeTime。我猜您有一段时间的小活动会导致大多数连接无效,然后HikariCP会同时匆忙创建大量连接并使DB过载CPU这就是您的DB请求排队和失败的原因。

你想要的是在HikariCP中连接的maxLifeTime比任何其他超时都要小或相等,所以你也可以将maxLifeTime调整为10分钟而不是30分钟,并且可以配置idleTimeout5分钟,它不应该影响性能很多连接不会同时创建