Spring Boot-JPA-Verbindung Validierung nicht funktioniert

Ich bin derzeit Debuggen eine kleine Anwendung erstellen mit spring boot(1.1.2.Release). Ich hab ein problem mit reconnect zur Datenbank, wenn eine Verbindung unterbrochen wurde (durch wait_timeout in der Produktion, oder getötet Verbindung in der Entwicklung). Ich bin derzeit mit den folgenden Konfigurationsparametern (Anwendung.Eigenschaften):

spring.datasource.url=jdbc:mysql://localhost:3306/test?autoreconnect=true
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test-on-borrow=true
spring.datasource.test-while-idle=true
spring.datasource.validation-query=SELECT 1;
spring.datasource.initial-size=2
... username+pw

spring.jpa.generate-ddl=true
spring.jpa.show-sql=true

Diese Ergebnisse in der folgenden Datenquelle:

org.apache.tomcat.jdbc.pool.DataSource@73e369e5{ConnectionPool[
defaultAutoCommit=null;
defaultReadOnly=null;
defaultTransactionIsolation=-1;
defaultCatalog=null;
driverClassName=com.mysql.jdbc.Driver;
maxActive=100;
maxIdle=100;
minIdle=10;
initialSize=2;
maxWait=30000;
testOnBorrow=true;
testOnReturn=false;
timeBetweenEvictionRunsMillis=5000;
numTestsPerEvictionRun=0;
minEvictableIdleTimeMillis=60000;
testWhileIdle=true;
testOnConnect=false;
password=********;
url=jdbc:mysql://localhost:3306/test?autoreconnect=true;
username=test;
validationQuery=SELECT 1;
;
validationQueryTimeout=-1;
validatorClassName=null;
validationInterval=30000;
accessToUnderlyingConnectionAllowed=true;
removeAbandoned=false;
removeAbandonedTimeout=60;
logAbandoned=false;
connectionProperties=null;
initSQL=null;
jdbcInterceptors=null;
jmxEnabled=true;
fairQueue=true;
useEquals=true;
abandonWhenPercentageFull=0;
maxAge=0;
useLock=false;
dataSource=null;
dataSourceJNDI=null;
suspectTimeout=0;
alternateUsernameAllowed=false;
commitOnReturn=false;
rollbackOnReturn=false;
useDisposableConnectionFacade=true;
logValidationErrors=false;
propagateInterruptState=false;
ignoreExceptionOnPreLoad=false;
}

Mein Problem ist jetzt, dass, wenn eine Verbindung unterbrochen, es dauert eine ganze Weile, bis die Verbindung wieder herzustellen. In der Zwischenzeit bekommen die Nutzer eine leere Seite und Ausnahmen, die geworfen werden auf der server-Seite. Von meinem Verständnis testOnBorrow sollten testen Sie die Verbindung jedes mal, bevor es verwendet wird und testWhileIdle alle 30 Sekunden. Aber das ist obiously nicht der Fall. Wenn ich mir bei mysql scheint es, dass alle 35 Sekunden etwas passiert und die Schlaf-Zeit wird zurückgesetzt, aber ich sehe keine querys in der Anwendung anmelden. Die Validierung Abfragen scheinen zu fehlen völlig.

Ich den Zugriff auf die Datenbank durch spring data repositories.

Momentan habe ich keine weiteren Ideen, was zu versuchen.

  • Nach dieser stackoverflow.com/questions/667289/... es ist mehr ein Allgemeines problem. Ich habe sogar Zweifel, es funktioniert ohne Feder boot, wie Sie die datasource-scheint richtig konfiguriert sein.
  • Mit autoreconnect=true ist mehr eine Art umklammert, um den letzten Strohhalm in der Hoffnung, es könnte helfen. Ich weiß, es löst eine Ausnahme aus, aber mein Verständnis ist, dass die Verbindung pool (tomcat-jdbc) aufgrund der validationquery sollte es abgefangen werden und wieder an die Datenbank, auch ohne autoreconnect=true.
  • Was können Sie tun, anstatt der Validierung auf leihen, möchten Sie vielleicht, um in regelmäßigen Abständen test-verbindungen und zu vertreiben sitzengelassen/verbindungen im Leerlauf. Siehe tomcatexpert.com/blog/2010/04/01/...
  • Danke, ich denke, dass hat mir sehr geholfen. Ich werde es mal ausprobieren das nächste mal, wenn ich eine chance bekomme.
  • Ich denke, man kann nicht jene in der Anwendung.Eigenschaften. hast du ein org.springframework.orm.jpa.LocalContainerEntityManagerFactorybean bean konfiguriert irgendwo? setzen Sie in der datasource-bean ist es Referenzierung
  • Beachten Sie, dass die Verwendung von autoReconnect nicht empfohlen : <br/> Die Verwendung dieser Funktion wird nicht empfohlen, da es die Nebenwirkungen im Zusammenhang mit session state und die Konsistenz der Daten, wenn Anwendungen nicht behandeln SQLExceptions richtig, und ist nur entworfen, um verwendet werden, wenn Sie nicht in der Lage sind, um die Anwendung so zu konfigurieren SQLExceptions behandeln, die aus Toten und veraltete verbindungen ordnungsgemäß.

InformationsquelleAutor ssindelar | 2014-06-25
Schreibe einen Kommentar