Spring Boot JPA – configuration自动重新连接

我有一个不错的小弹簧引导jpa web应用程序。 它被部署在亚马逊豆茎上,并使用亚马逊rds来保存数据。 然而,经常会有这样一个例外,那里不是那么经常使用的:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 79,870,633 milliseconds ago. The last packet sent successfully to the server was 79,870,634 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 

我不知道如何configuration这个设置,并且在http://spring.io上找不到关于它的信息(虽然是一个很好的网站)。 任何人有一些想法或信息的指针?

我假设启动为你configurationDataSource 。 在这种情况下,由于您正在使用MySQL,因此您可以将以下内容添加到您的application.properties最高为1.3

 spring.datasource.testOnBorrow=true spring.datasource.validationQuery=SELECT 1 

正如djxak在注释中提到的那样,1.4+为Spring Boot支持的四个连接池定义了特定的命名空间: tomcathikaridbcpdbcp2dbcp从1.5开始已弃用)。 您需要检查您正在使用的连接池,并检查是否支持该function。 上面的例子是用于tomcat的,所以你必须在1.4+中编写如下代码:

 spring.datasource.tomcat.testOnBorrow=true spring.datasource.tomcat.validationQuery=SELECT 1 

请注意, 不build议使用autoReconnect

不build议使用此function,因为它在应用程序不能正确处理SQLExceptions时会产生与会话状态和数据一致性相关的副作用,并且只能在您无法configuration应用程序以处理由SQLException导致的SQLException时使用死了和陈旧的连接。

以上build议对我不起作用。 真正有效的是在application.properties中包含了以下几行

 spring.datasource.testWhileIdle = true spring.datasource.timeBetweenEvictionRunsMillis = 3600000 spring.datasource.validationQuery = SELECT 1 

你可以在这里find解释

我刚搬到Spring Boot 1.4,发现这些属性被重命名为:

 spring.datasource.dbcp.test-while-idle=true spring.datasource.dbcp.time-between-eviction-runs-millis=3600000 spring.datasource.dbcp.validation-query=SELECT 1 

我有类似的问题。 Spring 4和Tomcat 8.我用Springconfiguration解决了这个问题

 <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> <property name="initialSize" value="10" /> <property name="maxActive" value="25" /> <property name="maxIdle" value="20" /> <property name="minIdle" value="10" /> ... <property name="testOnBorrow" value="true" /> <property name="validationQuery" value="SELECT 1" /> </bean> 

我testing过了。 它运作良好! 这两行为了重新连接数据库而做了一切事情:

 <property name="testOnBorrow" value="true" /> <property name="validationQuery" value="SELECT 1" />