我正在运行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 reconnect和How to reconnect database if the connection closed in spring jpa?中的答案进行操作。我不确定PostgreSQL的行为是否与MySQL不同。我对Spring Boot documentation的阅读没有帮助;我不知道所描述的组件是否足以理解我应该查看哪些文档。
答案 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
上的
(boolean)指示在从池中借用对象之前是否验证对象。如果对象无法验证,它将从池中删除,我们将尝试借用另一个。注 - 要使true值生效,必须将validationQuery或validatorClassName参数设置为非空字符串。 要获得更有效的验证,请参阅validationInterval 。默认值为false
但要注意validationInterval
:
(长)避免过度验证,仅在此频率下运行验证 - 以毫秒为单位的时间。 如果连接需要验证,但之前已在此时间间隔内验证过,则不会再次验证。默认值为30000(30秒)。