2016-09-18 406 views
10

我正在运行Spring Boot连接到PostgreSQL数据库。如果在数据库之后启动Spring Boot,我已验证数据已写入数据库。如何让Spring Boot自动重新连接到PostgreSQL?

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

您正在使用哪个连接池?如果你不使用它,你可能想尝试切换到Hikari。在过去,我已经看到过这样的问题,它使用'tomcat-jdbc',这是当前的默认连接池。 –

+1

您有借用测试,但您可能还希望在空闲和空闲超时时设置检查。这样,连接被定期检查并且如果无效则从池中移除。 –

+0

@AndyWilkinson我想我使用的是tomcat-jdbc,因为我的pom包含spring-boot-starter-jdbc。 – mattm

回答

6

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

由于您已经在借用和验证查询中使用了测试,只需尝试即可减少验证时间间隔,因此每次都会执行此操作。

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

上文本Tomcat jdbc connection pool上借:

(布尔值)的对象是否将从池中被借用被验证之前的指示。如果对象无法验证,它将从池中删除,我们将尝试借另一个。注 - 对于真正的值有任何影响,validationQuery或validatorClassName参数必须设置为非空字符串。 为了获得更高效的验证,请参阅validationInterval。默认值为false

但要注意(验证间隔):

(长)避免多余的验证,只有在这个频率下运行最多验证 - 以毫秒为单位的时间。 如果连接到期进行验证,但在此时间间隔内已被验证,则不会再次进行验证。默认值为30000(30秒)。

相关问题