如何让Spring Boot自动重新连接到PostgreSQL?

我正在运行Spring Boot连接到PostgreSQL数据库。我已经验证了如果在数据库之后启动Spring Boot,则数据已写入数据库。

spring.datasource.url = jdbc:postgresql://localhost/dbname
spring.datasource.username = user
spring.datasource.password = secret
spring.datasource.driver-class-name = org.postgresql.Driver
spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1

当开发中的数据库发生更改时,我会遇到异常:PreparedStatementCallback; SQL []; This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.

请注意,当发生异常时,数据库可以再次访问;我认为问题在于连接已过时,因为它最初连接到的数据库终端节点由于重新启动而不再可用。重新启动 Spring Boot 可解决此问题。

如何配置Spring Boot以重新连接到PostgreSQL,以便我不需要重新启动它?

我试图遵循Spring Boot JPA中的答案 - 配置自动重新连接如果连接在春季jpa中关闭,如何重新连接数据库?我不确定PostgreSQL的行为是否与MySQL不同。我对Spring Boot文档的阅读没有帮助;我对所描述的组件不够了解,无法理解我应该查看的文档。


答案 1

Spring Boot应配置为自动重新连接,问题是它不知道连接断开。

由于您已经在借用和验证查询上使用测试,因此只需尝试缩短验证间隔,以便每次都执行验证间隔。

spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=0

Tomcat jdbc connection pool on :testOnBorrow

(布尔值)指示在从池中借用对象之前是否将对其进行验证。如果对象无法验证,它将从池中删除,我们将尝试借用另一个对象。注意 - 要使 true 值生效,必须将 validationQuery 或 validatorClassName 参数设置为非空字符串。为了获得更有效的验证,请参阅验证间隔。默认值为假

但请注意:validationInterval

(长)避免过度验证,最多只在此频率下运行验证 - 时间以毫秒为单位。如果连接需要验证,但之前已在此时间间隔内进行了验证,则不会再次验证该连接。默认值为 30000(30 秒)。


答案 2

推荐