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

我正在运行Spring Boot连接到PostgreSQL数据库。 我已经validation,如果在数据库之后启动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 

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

请注意,exception发生时可以再次访问数据库; 我认为问题是连接是陈旧的,因为它最初连接的数据库端点由于重新启动而不再可用。 重新启动Spring Boot可以解决此问题。

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

我试图按照Spring Boot JPA中的答案- 配置自动重新连接以及如何在spring jpa中关闭 连接时 如何重新连接数据库? 。 我不确定PostgreSQL的行为是否与MySQL不同。 我阅读Spring Boot文档没有帮助; 我不知道所描述的组件是否足以理解我应该查看哪些文档。

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

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

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

testOnBorrow上的Tomcat jdbc连接池 :

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

但请注意validationInterval

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