Ich habe eine nette kleine Spring Boot JPA-Webanwendung. Es wird auf Amazon Beanstalk bereitgestellt und verwendet ein Amazon RDS zum Speichern von Daten. Es wird jedoch nicht so oft verwendet und schlägt daher nach einer Weile mit dieser Art von Ausnahme fehl:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Das letzte vom Server erfolgreich 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 in Betracht ziehen, die Gültigkeit der Verbindung vor der Verwendung in Ihrer Anwendung abzulaufen und / oder zu testen, die vom Server konfigurierten Werte für Client-Zeitüberschreitungen zu erhöhen oder die Connector / J-Verbindungseigenschaft 'autoReconnect = true' zu 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?
quelle
DataSource
um Ihre Eigenschaften auszudrucken und zu überprüfen. stackoverflow.com/a/36586630/148844 Spring Boot konfiguriert das nicht automatisch,DataSource
wenn Sie welche haben,@Beans
die a definierenDataSource
. docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/…Antworten:
Ich gehe davon aus, dass Boot das
DataSource
für Sie konfiguriert . In diesem Fall und da Sie MySQL verwenden, können Sie Folgendes zu Ihremapplication.properties
bis zu 1.3 hinzufügenWie djxak im Kommentar erwähnt, 1.4+ definiert spezifische Namensräume für die vier Verbindungen Pools Frühjahr Boot - Träger:
tomcat
,hikari
,dbcp
,dbcp2
(dbcp
als 1.5 veraltet). Sie müssen überprüfen, welchen Verbindungspool Sie verwenden und ob diese Funktion unterstützt wird. Das obige Beispiel war für Tomcat, daher müssten Sie es in 1.4+ wie folgt schreiben:Beachten Sie, dass die Verwendung von
autoReconnect
wird nicht empfohlen :quelle
spring.datasource.testOnBorrow
undspring.datasource.test-on-borrow
ganz gut funktioniert. Weitere Informationen finden Sie in der Dokumentation .SELECT 1
Garantiert, dass die Verbindung getestet wurde, bevor sie an die Anwendung übergeben wird. Durch die VerwendungtestOnBorrow = true
werden die Objekte validiert, bevor sie aus dem Pool ausgeliehen werden. Wenn das Objekt nicht validiert werden kann, wird es aus dem Pool entfernt und versucht, ein anderes auszuleihen. HINWEIS - Damit ein wahrer Wert eine Auswirkung hat, muss der ParameteralidQuery auf eine Zeichenfolge ungleich Null gesetzt werden.tomcat
,hikari
,dbcp
,dbcp2
. Für dentomcat-jdbc
Verbindungspool sollten die Eigenschaften beispielsweise wie folgt lauten:spring.datasource.tomcat.testOnBorrow=true
undspring.datasource.tomcat.validationQuery=SELECT 1
.If you define your own DataSource bean, auto-configuration will not occur.
Ich folgte einer Anleitung für OAuth2 und hatte@Bean(name = "OAuth") public DataSource secondaryDataSource()...
und es wurde weder automatisch konfiguriert noch verwendettestOnBorrow
.Die obigen Vorschläge haben bei mir nicht funktioniert. Was wirklich funktionierte, war die Aufnahme der folgenden Zeilen in die application.properties
Die Erklärung finden Sie hier
quelle
Die Einstellung
spring.datasource.tomcat.testOnBorrow=true
in application.properties hat nicht funktioniert.Die programmgesteuerte Einstellung wie unten funktionierte ohne Probleme.
quelle
Ich bin gerade zu Spring Boot 1.4 gewechselt und habe festgestellt, dass diese Eigenschaften umbenannt wurden:
quelle
whoamis Antwort ist die richtige. Mit den vorgeschlagenen Eigenschaften konnte ich dies nicht zum Laufen bringen (mit 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 bei der Verwendung von Spring Boot hilft:
quelle
Ich habe ein ähnliches Problem. Spring 4 und Tomcat 8. Ich löse das Problem mit der Spring-Konfiguration
Ich habe getestet. Es funktioniert gut! Diese beiden Zeilen tun alles, um die Verbindung zur Datenbank wiederherzustellen:
quelle
Falls jemand eine benutzerdefinierte DataSource verwendet
Die Eigenschaften sollten wie folgt aussehen. Beachten Sie die @ConfigurationProperties mit Präfix. Das Präfix steht vor dem eigentlichen Eigenschaftsnamen
Eine Referenz für Spring Version 1.4.4.RELEASE
quelle
Wie einige bereits erwähnt haben, verfügt Spring-Boot 1.4+ über spezifische Namespaces für die vier Verbindungspools. Standardmäßig wird Hikaricp in Spring-Boot 2+ verwendet. Sie müssen hier also die SQL angeben. Der Standardwert ist
SELECT 1
. Folgendes würden Sie beispielsweise für DB2 benötigen:spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1
Vorsichtsmaßnahme : Wenn Ihr Treiber JDBC4 unterstützt, wird dringend empfohlen, diese Eigenschaft nicht festzulegen. Dies gilt für "Legacy" -Treiber, die die JDBC4 Connection.isValid () - API nicht unterstützen. Dies ist die Abfrage, die ausgeführt wird, kurz 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, um Sie darüber zu informieren. Standard: keine
quelle
Für diejenigen, die dies von YAML aus mit mehreren Datenquellen tun möchten, gibt es einen großartigen Blog-Beitrag dazu: https://springframework.guru/how-to-configure-multiple-data-sources-in-a-spring-boot -Anwendung/
Grundsätzlich heißt es, dass Sie beide Datenquelleneigenschaften und Datenquellen wie folgt konfigurieren müssen:
Vergessen Sie nicht,
@Primary
aus anderen Datenquellen zu entfernen .quelle