无法验证连接(此连接已关闭。)。可能考虑使用较短的 maxLifetime 值

问题描述 投票:0回答:2

我看到以下错误消息:

HikariPool-1 - 无法验证连接 org.postgresql.jdbc.PgConnection@f162126(此连接已
关闭。)。可以考虑使用较短的

maxLifetime
值。
频繁刷新同一页面后会出现上述警告
超过
maxLifetime

这是我原来的数据库配置:

spring.datasource.hikari.auto-commit=false  
spring.datasource.hikari.idleTimeout=180000  
spring.datasource.hikari.minimumIdle=5  
spring.datasource.hikari.leakDetectionThreshold=240000    
spring.datasource.hikari.maximumPoolSize=10  
logging.level.com.zaxxer.hikari=TRACE  
spring.datasource.hikari.connectionTimeout=30000  
spring.datasource.hikari.maxLifetime=300000  
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG  

如果我更改以下属性,应用程序可以正常工作:

spring.datasource.hikari.maximumPoolSize=100
spring.datasource.hikari.maxLifetime=60000

谁能解释一下究竟发生了什么?

postgresql spring-boot database-connection connection-pooling
2个回答
31
投票

如错误消息所示,这是由 Hikari 连接池尝试使用已关闭的连接引起的。

您的数据库连接只是 TCP 连接,当这些连接闲置时间过长时,它们可能会被数据库或中间的任何防火墙关闭。

Hikari CP 正在检查连接,看看它是否仍然有效并且可以使用。如果它已经关闭,它会警告您,因为打开新连接会增加数据库访问的延迟。 您可以看到该方法中抛出的错误

isConnectionAlive
here

客户端

如错误消息所示,您可以减少

maxLifetime
配置来解决此问题。

maxLifetime
属性是客户端关闭连接之前的时间。正如 Hikari CP 文档中所建议的,这应该比任何数据库/架构超时至少短几秒。

原因是,如果 Hikari CP 总是在数据库之前关闭连接,它就永远不会尝试使用已经关闭的连接。

由于我不了解您的数据库或架构,因此我无法建议这应该是什么值。您需要找出连接的空闲超时,以准确设置您的

maxLifetime
配置。

您可以在 Hikari Github 自述文件上阅读此属性的文档。

数据库端

如果您的数据库(而不是防火墙等)是 TCP 超时的瓶颈,则 Postgres 的一些连接设置也会产生影响。

我想提及这些,但更改这些并不是真的必要,因为这些通常是合理的默认值。

您可以在连接设置 Postgres 文档

中找到属性的文档

这些是您正在寻找的房产:

tcp_keepalives_idle

这是 TCP 连接在发送之前应空闲的时间量。 操作系统发送保活消息。

tcp_keepalives_interval

这是操作系统发送未确认的消息后的时间量 在重试之前保持活动消息。

tcp_keepalives_count

这是未确认的保活消息的数量 在连接被视为失效之前发送。


0
投票

如果是在testcontainer测试过程中发生的,可以通过注解解决 @DirtiesContext SpringBootTest 在测试之间重用 Spring 上下文,因此测试之间有一个公共的 Hikari Pool。但在后台,测试容器杀死了一个容器,并在下一次测试之前创建了一个新容器。 SpringBootTest 不知道该更改会导致新的 Postgres 容器,因此 Hikari Pool 与之前的测试中的相同。

© www.soinside.com 2019 - 2024. All rights reserved.