嗨Stackoverflow家族,
所以我们有一个静态编程语言的应用程序
假设Hikari中一切正常,连接关闭并根据默认为30分钟的maxliftime添加,日志如下所示:
突然间,大多数连接都失效了。假设40个中的30个。连接在超过最大生命周期之前就关闭了,所有关闭的连接的日志如下所示:
此外,在这些消息之后,后跟多个此日志,如下所示:
超时失败统计如下:
最后,由于大多数请求没有可用的连接,我留下了很多请求的连接超时:
我添加了泄漏检测阈值,在问题发生期间它也会像下面这样记录:
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也没有帮助。我非常感谢任何评论或提示,因为我们已经处理这个问题将近一周了。
原因可能是您在Postgres端设置了idle_session_timeout
,或者系统中其他一些连接超时时间小于maxLifeTime
。我猜您有一段时间的小活动会导致大多数连接无效,然后HikariCP会同时匆忙创建大量连接并使DB过载CPU这就是您的DB请求排队和失败的原因。
你想要的是在HikariCP中连接的maxLifeTime比任何其他超时都要小或相等,所以你也可以将maxLifeTime
调整为10分钟而不是30分钟,并且可以配置idleTimeout
5分钟,它不应该影响性能很多连接不会同时创建