【问题标题】:How do I get Spring Boot to automatically reconnect to PostgreSQL?如何让 Spring Boot 自动重新连接到 PostgreSQL?
【发布时间】:2017-01-26 13:51:31
【问题描述】:

我正在运行连接到 PostgreSQL 数据库的 Spring Boot。如果在数据库之后启动 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 的阅读没有帮助;我不太了解所描述的组件,无法理解我应该查看哪些文档。

【问题讨论】:

  • 您使用的是哪个连接池?如果您不使用它,您可能想尝试切换到 Hikari。我过去曾在tomcat-jdbc 看到过类似的问题,这是目前的默认连接池。
  • 您已经对借用进行了测试,但您可能还想设置空闲和空闲超时时的检查。这样会定期检查连接,如果无效,则将其从池中删除。
  • @AndyWilkinson 我想我正在使用 tomcat-jdbc 因为我的 pom 包含 spring-boot-starter-jdbc。

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


【解决方案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 pooltestOnBorrow:

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

但请注意validationInterval:

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

【讨论】:

  • 对于validationInterval,默认值应该是3000 (3 seconds),不是吗?
猜你喜欢
  • 2017-09-12
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
相关资源
最近更新 更多