Spring Boot JPA-настройка автоматического повторного подключения
У меня есть хороший маленький spring boot jpa веб-приложение. Он развернут на amazon beanstalk и использует amazon 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.
Я не уверен, как настроить этот параметр и не могу найти информацию о нем на http://spring.io (очень хороший сайт, хотя). У кого-нибудь есть идеи или ссылки на информацию ?
7 ответов:
Я предполагаю, что загрузка конфигурации
DataSourceдля вас. В этом случае, и так как вы используете MySQL, вы можете добавить следующее к вашемуapplication.propertiesдо 1.3spring.datasource.testOnBorrow=true spring.datasource.validationQuery=SELECT 1как отметил djxak в комментарии, 1.4 + определяет конкретные пространства имен для четырех пулов соединений Spring Boot поддерживает:
tomcat,hikari,dbcp,dbcp2(dbcpявляется устаревшим по состоянию на 1.5). Вам нужно проверить, какой пул соединений вы используете, и проверить, поддерживается ли эта функция. Приведенный выше пример был для tomcat, поэтому вам придется написать его следующим образом в 1.4+:spring.datasource.tomcat.testOnBorrow=true spring.datasource.tomcat.validationQuery=SELECT 1обратите внимание, что использование
autoReconnectи не рекомендуется:использование этой функции не рекомендуется, поскольку она имеет побочные эффекты, связанные с состоянием сеанса и согласованностью данных, когда приложения не обрабатывают SQLExceptions должным образом, и предназначена только для использования, когда вы не можете настроить приложение для обработки SQLExceptions в результате мертвых и устаревших соединения правильно.
приведенные выше рекомендации не работают для меня. Что действительно сработало, так это включение в приложение следующих строк.свойства
spring.datasource.testWhileIdle = true spring.datasource.timeBetweenEvictionRunsMillis = 3600000 spring.datasource.validationQuery = SELECT 1вы можете найти объяснениездесь
Я просто перешел на 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.datasource.tomcat.testOnBorrow=trueв приложение.свойства не работают.программно установка, как показано ниже, работала без каких-либо проблем.
import org.apache.tomcat.jdbc.pool.DataSource; import org.apache.tomcat.jdbc.pool.PoolProperties; @Bean public DataSource dataSource() { PoolProperties poolProperties = new PoolProperties(); poolProperties.setUrl(this.properties.getDatabase().getUrl()); poolProperties.setUsername(this.properties.getDatabase().getUsername()); poolProperties.setPassword(this.properties.getDatabase().getPassword()); //here it is poolProperties.setTestOnBorrow(true); poolProperties.setValidationQuery("SELECT 1"); return new DataSource(poolProperties); }
у меня аналогичная проблема. Весна 4 и Tomcat 8. Я решаю проблему с весенней конфигурацией
<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>Я испытал. Это хорошо работает! Эта две строки делает все для того, чтобы снова подключиться к базе данных:
<property name="testOnBorrow" value="true" /> <property name="validationQuery" value="SELECT 1" />
Если кто-то использует пользовательский источник
@Bean(name = "managementDataSource") @ConfigurationProperties(prefix = "management.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); }свойства должны выглядеть следующим образом. Обратите внимание на свойства @ConfigurationProperties с префиксом. Префикс-это все перед фактическим именем свойства
management.datasource.test-on-borrow=true management.datasource.validation-query=SELECT 1ссылка на весеннюю версию 1.4.4.Отпустите
@whoami ответ правильный, используя свойства, как было предложено, я не смог заставить это работать (используя spring boot 1.5.3.Отпустите)
Я добавляю свой ответ, так как его полный класс конфигурации, поэтому он может помочь кому-то использовать spring boot
@Configuration @Log4j public class SwatDataBaseConfig { @Value("${swat.decrypt.location}") private String fileLocation; @Value("${swat.datasource.url}") private String dbURL; @Value("${swat.datasource.driver-class-name}") private String driverName; @Value("${swat.datasource.username}") private String userName; @Value("${swat.datasource.password}") private String hashedPassword; @Bean public DataSource primaryDataSource() { PoolProperties poolProperties = new PoolProperties(); poolProperties.setUrl(dbURL); poolProperties.setUsername(userName); poolProperties.setPassword(password); poolProperties.setDriverClassName(driverName); poolProperties.setTestOnBorrow(true); poolProperties.setValidationQuery("SELECT 1"); poolProperties.setValidationInterval(0); DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(poolProperties); return ds; } }
Comments