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 (очень хороший сайт, хотя). У кого-нибудь есть идеи или ссылки на информацию ?

792   7  

7 ответов:

Я предполагаю, что загрузка конфигурации DataSource для вас. В этом случае, и так как вы используете MySQL, вы можете добавить следующее к вашему application.properties до 1.3

spring.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

    Ничего не найдено.