2014-06-25 21 views
6

Ich bin derzeit Debuggen einer kleinen Anwendung, die mit Spring-Boot (1.1.2.Release) erstellt wird. Ich habe ein Problem mit der Wiederverbindung mit der Datenbank, wenn eine Verbindung verloren geht (aufgrund von wait_timeout in der Produktion oder einer abgebrochenen Verbindung in der Entwicklung). Ich verwende derzeit die folgenden Konfigurationsparameter (application.properties):Spring Boot JPA Verbindung Validierung funktioniert nicht

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 

Die in der folgenden Datenquelle Ergebnisse:

[email protected]{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 verloren geht dauert es eine ganze solange, bis die Verbindung wieder hergestellt ist. In der Zwischenzeit erhalten die Benutzer eine leere Seite und Ausnahmen werden auf der Serverseite ausgelöst. Aus meiner Sicht sollte testOnBorrow die Verbindung jedes Mal testen, bevor es verwendet wird und testWhileIdle alle 30 Sekunden. Aber das ist offensichtlich nicht der Fall. Wenn ich mysql betrachte, scheint es, dass alle 35 Sekunden etwas passiert und die Ruhezeit zurückgesetzt wird, aber ich sehe keine Anfragen im Anwendungsprotokoll. Die Validierungsabfragen scheinen vollständig zu fehlen.

Ich greife auf die Datenbank über die Repositorys von spring data zu.

Ich habe derzeit keine weiteren Ideen, was ich versuchen soll.

+0

Laut http://stackoverflow.com/questions/667289/why-does-autoreconnect-true-not-seem-to-work ist es eher ein generisches Problem. Ich bezweifle sogar, dass es ohne Spring-Boot funktioniert, da die Datenquelle scheint korrekt konfiguriert zu sein. –

+0

Die Verwendung von autoreconnect = true ist eher eine Art, sich an den letzten Strohhalm zu klammern, in der Hoffnung, dass es helfen könnte. Ich weiß, dass es eine Ausnahme wirft, aber mein Verständnis ist, dass der Verbindungspool (tomcat-jdbc) aufgrund der Validierungsabfrage gefangen und wieder mit der Datenbank verbunden werden sollte, auch ohne autoreconnect = true. – ssindelar

+3

Was Sie tun können, statt auf Kredit zu validieren, möchten Sie möglicherweise regelmäßig Verbindungen testen und verlassene/inaktive Verbindungen entfernen. Siehe http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency –

Antwort

1

Versuchen Sie, statt Tomcat für Ihren Verbindungspool zu HikariCP zu tauschen, da es Timeouts/Verbindungsverlust zu behandeln scheint a lot better. Spring Boot wird ein HikariCP automatisch konfigurieren, wenn es im Klassenpfad vorhanden ist, und Tomcat-jdbc nicht.

Verwandte Themen