it-swarm.com.de

Spring Boot JPA - Konfigurieren der automatischen Wiederverbindung

Ich habe eine schöne kleine Spring Boot JPA-Webanwendung. Es wird auf Amazon Beanstalk bereitgestellt und verwendet ein Amazon RDS, um Daten zu speichern. Es wird jedoch nicht so oft verwendet und versagt daher mit dieser Ausnahme nach einiger Zeit:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Das letzte erfolgreich vom Server empfangene Paket war vor 79.870.633 Millisekunden.
Das letzte erfolgreich an den Server gesendete Paket war vor 79.870.634 Millisekunden. ist länger als der vom Server konfigurierte Wert von 'wait_timeout'. Sie sollten erwägen, ob die Gültigkeit der Verbindung abläuft und/oder getestet wird, bevor Sie sie in Ihrer Anwendung verwenden, die vom Server konfigurierten Werte für Client-Timeouts erhöhen oder die Connector/J-Verbindungseigenschaft 'autoReconnect = true' verwenden, um dieses Problem zu vermeiden.

Ich bin nicht sicher, wie ich diese Einstellung konfigurieren soll und kann keine Informationen dazu auf http://spring.io finden (eine sehr gute Seite). Was sind einige Ideen oder Hinweise auf Informationen?

90
stoffer

Ich gehe davon aus, dass boot die DataSource für Sie konfiguriert. In diesem Fall und da Sie MySQL verwenden, können Sie Ihrem application.properties bis 1.3 Folgendes hinzufügen

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

Wie djxak im Kommentar feststellt, definiert 1.4+ bestimmte Namespaces für die vier von Spring Boot unterstützten Verbindungspools: Tomcat, hikari, dbcp, dbcp2 (dbcp ist seit 1.5 veraltet). Sie müssen prüfen, welchen Verbindungspool Sie verwenden, und prüfen, ob diese Funktion unterstützt wird. Das obige Beispiel war für Tomcat, daher müssten Sie es in 1.4+ wie folgt schreiben:

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

Beachten Sie, dass die Verwendung von autoReconnectnicht empfohlen wird :

Die Verwendung dieser Funktion wird nicht empfohlen, da sie Nebenwirkungen hat, die sich auf den Sitzungsstatus und die Datenkonsistenz beziehen, wenn Anwendungen SQLExceptions nicht ordnungsgemäß verarbeiten, und nur dazu gedacht ist, wenn Sie Ihre Anwendung nicht für die Verarbeitung von SQLExceptions konfigurieren können tote und veraltete Verbindungen richtig.

122
Stephane Nicoll

Die obigen Vorschläge haben für mich nicht funktioniert. Was wirklich funktioniert hat, war die Einbeziehung der folgenden Zeilen in die application.properties

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

Die Erklärung finden Sie hier

25
Soumya

Ich bin gerade zu Spring Boot 1.4 umgestiegen und habe festgestellt, dass diese Eigenschaften umbenannt wurden:

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

Das Setzen von spring.datasource.Tomcat.testOnBorrow=true in application.properties hat nicht funktioniert. 

Die programmgesteuerte Einstellung wie unten funktionierte ohne Probleme. 

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

Ich habe ein ähnliches Problem. Spring 4 und Tomcat 8. Ich löse das Problem mit der Spring-Konfiguration

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

Ich habe getestet Es läuft gut! Diese zwei Zeilen tun alles, um sich wieder mit der Datenbank zu verbinden:

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

whoamis Antwort ist die richtige. Die vorgeschlagenen Eigenschaften konnten nicht verwendet werden (Spring Boot 1.5.3.RELEASE).

Ich füge meine Antwort hinzu, da es sich um eine vollständige Konfigurationsklasse handelt, die möglicherweise jemandem hilft, der Spring Boot verwendet:

@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;
    }
}
1
naoru

Falls jemand eine benutzerdefinierte DataSource verwendet

@Bean(name = "managementDataSource")
@ConfigurationProperties(prefix = "management.datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

Eigenschaften sollten wie folgt aussehen. Beachten Sie die @ConfigurationProperties mit Präfix. Das Präfix steht vor dem eigentlichen Eigenschaftsnamen

management.datasource.test-on-borrow=true
management.datasource.validation-query=SELECT 1

Eine Referenz für die Spring-Version 1.4.4.RELEASE

1
Justin

Wie bereits erwähnt wurde, hat spring-boot 1.4+ bestimmte Namespaces für die vier Verbindungspools. Standardmäßig wird Hikaricp in Spring-Boot 2+ verwendet. Sie müssen also die SQL hier angeben. Der Standardwert ist SELECT 1. Folgendes benötigen Sie für DB2: spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1  

Caveat : Wenn Ihr Treiber JDBC4 unterstützt, empfehlen wir dringend, diese Eigenschaft nicht festzulegen. Dies gilt für "ältere" Treiber, die die JDBC4 Connection.isValid () - API nicht unterstützen. Dies ist die Abfrage, die ausgeführt wird, bevor Sie eine Verbindung aus dem Pool erhalten, um zu überprüfen, ob die Verbindung zur Datenbank noch besteht. Versuchen Sie erneut, den Pool ohne diese Eigenschaft auszuführen. HikariCP protokolliert einen Fehler, wenn Ihr Treiber nicht JDBC4-kompatibel ist. Voreinstellung: keine

0
code4kix