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

时间:2016-09-18 23:29:21

标签: java spring postgresql spring-boot spring-jdbc

我正在运行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 - configuring auto reconnectHow to reconnect database if the connection closed in spring jpa?中的答案进行操作。我不确定PostgreSQL的行为是否与MySQL不同。我对Spring Boot documentation的阅读没有帮助;我不知道所描述的组件是否足以理解我应该查看哪些文档。

1 个答案:

答案 0 :(得分:8)

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

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

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

Tomcat jdbc connection pool

  

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

但要注意validationInterval

  

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