Spring Загрузка JPA - настройка автоматического повторного подключения

У меня есть симпатичное маленькое веб-приложение Spring Boot JPA. Он развернут в Amazon Beanstalk и использует Amazon RDS для сохранения данных. Однако он не используется так часто и поэтому не проходит через некоторое время с таким исключением:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: последний пакет, успешно полученный от сервера, был 79 870 633 миллисекунд назад.
    Последний пакет, успешно отправленный на сервер, был 79 870 634 миллисекунд назад. больше, чем сконфигурированное сервером значение wait_timeout.     Чтобы избежать этой проблемы, следует рассмотреть возможность истечения срока действия и/или проверки допустимости подключения перед использованием в приложении, увеличения значений, настроенных сервером для тайм-аутов клиента, или использования свойства подключения Connector/J 'autoReconnect = true'.

Я не уверен, как настроить этот параметр, и не могу найти информацию о нем на http://spring.io (очень хороший сайт). Каковы некоторые идеи или указатели на информацию?

Ответ 1

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

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

Как отмечает djxak в комментарии, 1.4+ определяет конкретные пространства имен для четырех пулов соединений Spring Поддержка загрузки: tomcat, hikari, dbcp, dbcp2 (dbcp устарела от 1.5). Вам нужно проверить, какой пул подключений вы используете, и проверить, поддерживается ли эта функция. Пример выше был для tomcat, поэтому вам нужно записать его в 1.4 +:

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

Обратите внимание, что использование autoReconnect не рекомендуется:

Использование этой функции не рекомендуется, поскольку она имеет побочные эффекты, связанные с состоянием сеанса и согласованностью данных, когда приложения не обрабатывают SQLExceptions правильно и предназначены только для использования, когда вы не можете настроить приложение для обработки SQLExceptions, вызванные мертвыми и устаревшими соединениями.

Ответ 2

Вышеуказанные предложения не помогли мне. Что действительно работало, так это включение следующих строк в application.properties

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

Вы можете найти объяснение здесь

Ответ 3

Я просто перешел в 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

Ответ 4

Установка spring.datasource.tomcat.testOnBorrow=true в application.properties не работает.

Программная настройка, как показано ниже, работала без проблем.

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);
}

Ответ 5

У меня схожая проблема. Spring 4 и Tomcat 8. Я решаю проблему с конфигурацией Spring

<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" />

Ответ 6

Whoami ответ является правильным. Используя предложенные свойства, я не смог заставить это работать (используя Spring Boot 1.5.3.RELEASE)

Я добавляю свой ответ, поскольку это полный класс конфигурации, поэтому он может помочь кому-то, использующему 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;
    }
}

Ответ 7

В случае, если кто-то использует собственный источник данных

@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

Ссылка на версию Spring 1.4.4.RELEASE

Ответ 8

Как уже отмечали некоторые люди, у Spring-boot 1. 4+ есть определенные пространства имен для четырех пулов соединений. По умолчанию hikaricp используется в весенней загрузке 2+. Так что вам придется указать здесь SQL. По умолчанию установлено значение SELECT 1. Вот что вам нужно для DB2, например: spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1

Предупреждение: Если ваш драйвер поддерживает JDBC4, мы настоятельно рекомендуем не устанавливать это свойство. Это для устаревших драйверов, которые не поддерживают API JDBC4 Connection.isValid(). Это запрос, который будет выполнен непосредственно перед тем, как вам будет дано соединение из пула, чтобы проверить, что соединение с базой данных еще живо. Снова, попробуйте запустить пул без этого свойства, HikariCP будет регистрировать ошибку, если ваш драйвер не совместим с JDBC4, чтобы сообщить вам. По умолчанию: нет