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

mat*_*ttm 14 java postgresql spring spring-jdbc spring-boot

我正在运行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
Run Code Online (Sandbox Code Playgroud)

当开发中的数据库发生变化时,我会遇到异常: 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中的答案- 配置自动重新连接如何在spring jpa中关闭连接时如何重新连接数据库?.我不确定PostgreSQL的行为是否与MySQL不同.我阅读Spring Boot文档没有帮助; 我不知道所描述的组件是否足以理解我应该查看哪些文档.

rho*_*ath 8

应该将Spring启动配置为自动重新连接,问题是它不知道连接断开.

由于您已经在借用和验证查询中使用测试,因此只需尝试减少验证间隔,以便每次都执行它.

spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=0
Run Code Online (Sandbox Code Playgroud)

Tomcat的JDBC连接池testOnBorrow:

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

但请注意validationInterval:

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