2016-07-11 11 views
0

Die Anwendung verbindet sich mit MS SQL Server. Es verwendet die ComboPooledDataSource c3p0 in der Tomcat- und Spring-Umgebung.c3p0 erneut verbinden nach Netzwerkausfall

Wenn die Anwendung die Datenbankverbindung verliert und einige Sekunden später wieder verfügbar ist, stellt die Anwendung die Verbindung wieder her und kann die Datenbank schnell abfragen (sobald das Netzwerk wieder verfügbar ist). Aber es ist der Netzwerkausfall länger, die Anwendung benötigt mehr als 10 Minuten, um eine DB-Verbindung wiederherzustellen, nachdem das Netzwerk zurückkam.

Ich sehe diese Protokolle, wenn die DB-Verbindung nach 10 Minuten zurück:

[WARNING] Exception on close of inner statement.java.sql.SQLException: Invalid state, the Connection object is closed. 
at net.sourceforge.jtds.jdbc.TdsCore.checkOpen(TdsCore.java:481)  
[WARNING] [c3p0] A PooledConnection that has already signalled a Connection error is still in use! 
[WARNING] [c3p0] Another error has occurred [ java.sql.SQLException: Invalid state, the Connection object is closed. ] which will not be reported to listeners!java.sql.SQLException: Invalid state, the Connection object is closed. 

Hier ist die Feder config.xml Konfiguration:

<bean id="CommonDataSource" abstract="true" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="net.sourceforge.jtds.jdbc.Driver" /> 
    <property name="minPoolSize" value="${db.minPoolSize}" /> 
    <property name="maxPoolSize" value="${db.maxPoolSize}" /> 
    <property name="acquireRetryAttempts" value="0" /> 
    <property name="checkoutTimeout" value="0" /> 
    <property name="testConnectionOnCheckout" value="true" /> 
    <property name="testConnectionOnCheckin" value="false" /> 
    <property name="idleConnectionTestPeriod" value="10" /> 
    <property name="preferredTestQuery" value="select 1" /> 
</bean> 

Ich habe versucht, andere Konfigurationen, mit einem nicht -zero checkoutTimeout, testConnectionOnCheckout = false und testConnectionOnCheckin = true, die Wiederherstellung ist immer noch sehr lang.

Was ist falsch an meiner Konfiguration? Ich möchte die DB-Verbindung wiederherstellen, sobald Netzwerkprobleme behoben sind.

Vielen Dank für Sie

EDIT mit Hakari Konfiguration von M. Deinum

Hallo,

Ich habe versucht, mit dieser Hakari Konfiguration wie vorgeschlagen helfen:

<bean id="CommonDataSource" abstract="true" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> 
    <property name="maximumPoolSize" value="${db.maxPoolSize}" /> 
    <property name="connectionTestQuery" value="select 1"/> 
    <property name="allowPoolSuspension" value="true"/> 
</bean> 

Aber das Verhalten ist ähnlich: Ich muss auf 10-15 warten Minuten, bevor die Datenbankverbindung wiederhergestellt wird.

Hätten Sie bitte einen Vorschlag?

+0

Für den Anfang würde ich einen anderen Verbindungspool etwas wie [HikariCP] (https://github.com/brettwooldridge/HikariCP) anstelle von C3P0 verwenden. Außerdem würde ich vorschlagen, die JDBC-Treiber von Microsoft zu verwenden, da diese aktueller sind und JDBC 4.x-Optionen unterstützen. Der jtds-Treiber hat diese Unterstützung nicht (er ist in JDBC 3.0 festgefahren). –

+0

Zusätzlich https://github.com/brettwooldridge/HikariCP/wiki/Bad-Behavior:-Handling-Database-Down ist eine interessante lesen (die auch erwähnt, das Problem, das Sie haben, scheinbar c3p0 stürzt ab, wenn Netzwerkprobleme auftreten). –

+0

@M. Deinum: Danke für deine Antwort. Glaubst du, ich kann mit c3p0 das Ziel nicht erreichen? Ist HikariCP sicher für die Produktion? – marcesso

Antwort

2

Das Problem bezog sich weder auf c3p0 noch auf HikariCP. Ich hatte die JDBC-URL zu ändern, und fügen Sie diese Eigenschaften:

loginTimeout=60;socketTimeout=60 

Vielleicht nur ein genug ist, aber ich konnte die Arbeit mit diesen beiden zu tun. Dieser Link hilft viel

Verwandte Themen