S R*_*ddy 10 postgresql database-connection connection-pooling spring-boot
maxLifetime值。频繁刷新同一个页面,超出后出现上述警告maxLifetimespring.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.auto-commit=false spring.datasource.hikari.idleTimeout=3000 spring.datasource.hikari.minimumIdle=5 spring.datasource.hikari.leakDetectionThreshold=240000 spring.datasource.hikari.maximumPoolSize=100 logging.level .com.zaxxer.hikari=TRACE spring.datasource.hikari.connectionTimeout=30000 spring.datasource.hikari.maxLifetime=60000 logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
can any one explain what is happening exactly?
Run Code Online (Sandbox Code Playgroud)
正如错误消息所暗示的那样,这是由 Hikari 连接池尝试使用已关闭的连接引起的。
您的数据库连接只是 TCP 连接,当它们闲置时间过长时,它们可以被数据库或中间的任何防火墙关闭。
Hikari CP 正在检查连接以查看它是否还活着并且可以使用。如果它已经关闭,它会警告您,因为打开新连接会增加您的数据库访问延迟。您可以在isConnectionAlive 此处看到方法中抛出的错误。
客户端
正如错误消息所暗示的那样,您可以减少maxLifetime配置以解决此问题。
该maxLifetime属性是客户端关闭连接之前的时间。正如 Hikari CP 文档中所建议的,这应该比任何数据库/架构超时至少短几秒钟。
原因是如果 Hikari CP 总是在数据库之前关闭连接,它永远不会尝试使用已经关闭的连接。
由于我不了解您的数据库或架构,因此我无法建议这应该是什么价值。您需要找出连接的空闲超时以准确设置您的maxLifetime配置。
您可以在Hikari Github 自述文件中阅读此属性的文档。
数据库端
如果您的数据库(而不是防火墙等)是 TCP 超时的瓶颈,那么 Postgres 的一些连接设置也会产生影响。
我想提及这些,但更改这些并不是真正必要的,因为这些通常是合理的默认值。
您可以在连接设置 Postgres 文档中找到属性的文档
这些是您正在寻找的属性:
tcp_keepalives_idle
这是在操作系统发送保活消息之前 TCP 连接应该空闲的时间量。
tcp_keepalives_interval
这是操作系统发送未确认的 keepalive 消息后重试之前的时间量。
tcp_keepalives_count
这是在连接被视为死亡之前可以发送的未确认保持活动消息的数量。
| 归档时间: |
|
| 查看次数: |
5901 次 |
| 最近记录: |