kotlin Hikari CP连接突然失效

mm9b1k5b  于 2023-02-24  发布在  Kotlin
关注(0)|答案(1)|浏览(436)
    • bounty将在2天后过期**。回答此问题可获得+50的声誉奖励。Habil Ganbarli正在寻找来自声誉良好来源的答案

嗨,斯塔克弗鲁夫一家,
因此,我们有一个应用程序与Kotlin & Spring启动,使用一个单一的DB示例(1 GB内存和示例类是db.t3.micro)作为PostgreSQL,并托管在AWS中。在过去几天发生的事情是,突然我的池中的连接无效(每天2 - 3次),池大小急剧下降。
假设Hikari中一切正常,连接已关闭并根据maxliftime(默认为30分钟)添加,日志如下所示:

      • 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. SQL临时连接异常:HikariPool-1-连接不可用,请求在30000ms后超时**

我已经添加了泄漏检测阈值,在问题发生期间,它也会记录如下:

      • 线程http-nio-8080-exec-482上的org.postgresql.jdbc.PgConnection@3bb5f155已触发连接泄漏检测,堆栈跟踪如下**
      • java. lang.异常:检测到明显的连接泄漏**

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 with resources,然而,这对我们来说不是这样,因为我们不手动获取连接。除此之外,将最大池大小从20增加到40也没有帮助。我真的很感激任何评论或提示,因为我们正在处理这个问题几乎一个星期。

omqzjyyz

omqzjyyz1#

原因可能是您在Postgres端设置了idle_session_timeout,或者系统中的其他连接超时小于maxLifeTime。我猜您有一段时间的小活动,然后导致大多数连接无效,然后HikariCP匆忙地同时创建大量连接,并使DB CPU过载,这就是为什么您的DB请求排队和失败。
您希望HikariCP中的连接的maxLifeTime小于或等于任何其他超时,因此您还可以将maxLifeTime调整为10分钟(而不是30分钟),也可以将idleTimeout配置为5分钟,这样不会影响性能,因为不会同时创建大量连接

相关问题