- 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也没有帮助。我真的很感激任何评论或提示,因为我们正在处理这个问题几乎一个星期。
1条答案
按热度按时间omqzjyyz1#
原因可能是您在Postgres端设置了
idle_session_timeout
,或者系统中的其他连接超时小于maxLifeTime
。我猜您有一段时间的小活动,然后导致大多数连接无效,然后HikariCP匆忙地同时创建大量连接,并使DB CPU过载,这就是为什么您的DB请求排队和失败。您希望HikariCP中的连接的maxLifeTime小于或等于任何其他超时,因此您还可以将
maxLifeTime
调整为10分钟(而不是30分钟),也可以将idleTimeout
配置为5分钟,这样不会影响性能,因为不会同时创建大量连接