2008-08-19 16 views
13

Ich habe ein Tomcat-Instanz-Setup, aber die Datenbankverbindung, die ich in context.xml konfiguriert habe, bleibt nach Perioden der Inaktivität stehen.Java + Tomcat, Dying Datenbankverbindung?

Wenn ich überprüfen Sie die Protokolle ich die folgende Fehlermeldung erhalten:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Das letzte Paket erfolgreich vom Server empfangen was68051 Sekunden vor. Das letzte Paket, das erfolgreich an den Server gesendet wurde, war 68051 Sekunden vor, die länger ist als der Server konfiguriert Wert von 'wait_timeout'. Sie sollten die Verbindungsgültigkeit vor der Verwendung in Ihrer Anwendung entweder ablaufen lassen und/oder testen, indem Sie die Serverkonfigurationswerte für Client-Timeouts erhöhen oder die Verbindungseigenschaft 'autoReconnect = true' des Connectors/J verwenden, um dieses Problem zu vermeiden. Hier

ist die Konfiguration in context.xml:

<Resource name="dataSourceName" 
     auth="Container" 
     type="javax.sql.DataSource" 
     maxActive="100" 
     maxIdle="30" 
     maxWait="10000" 
     username="username" 
     password="********" 
     removeAbandoned = "true" 
     logAbandoned = "true" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8" /> 

I autoReconnect = ture bin mit wie der Fehler zu tun, sagt, aber die Verbindung hält sterben. Ich habe das noch nie zuvor gesehen.

Ich habe auch verifiziert, dass alle Datenbankverbindungen ordnungsgemäß geschlossen werden.

Antwort

8

Tomcat Documentation

DBCP verwendet die Jakarta-Commons-Datenbank Connection Pool. Es beruht auf der Anzahl der Jakarta-Commons-Komponenten:

* Jakarta-Commons DBCP 
* Jakarta-Commons Collections 
* Jakarta-Commons Pool 

Dieses Attribut kann Ihnen helfen.

removeAbandonedTimeout="60" 

Ich benutze die gleiche Connection Pooling Sachen und ich bin Einstellung dieser Eigenschaften die gleiche Sache zu verhindern, dass es ist einfach nicht durch tomcat konfiguriert. Aber wenn die erste Sache nicht funktioniert, versuche diese.

testWhileIdle=true 
timeBetweenEvictionRunsMillis=300000 
+0

Schön. Ich setze die Parameter in context.xml, und ich lasse es für 24 Stunden sitzen. Wenn es nicht funktioniert, werde ich die Antwort nicht akzeptieren. Aber es sieht vielversprechend aus! Vielen Dank! –

0

Ich weiß nicht, ob die obige Antwort tut im Grunde das Gleiche, aber einige unserer Systeme nutzen die DB-Verbindung etwa eine Woche einmal, und ich habe gesehen, dass wir eine -Otimeout Flagge oder etwas vorsehen Sortiere nach mysql, um das Verbindungszeitlimit festzulegen.

5

Nur um zu klären, was das eigentlich verursacht. Standardmäßig beendet MySQL offene Verbindungen nach 8 Stunden Inaktivität. Der Datenbankverbindungspool behält jedoch Verbindungen länger als diese bei.

Wenn Sie also timeBetweenEvictionRunsMillis = 300000 setzen, weisen Sie den Verbindungspool an, alle 5 Minuten Verbindungen auszuführen und zu verwerfen und unbenutzte Verbindungen zu schließen.

+0

Wie heißt diese Immobilie? Ich würde es gerne überprüfen. "thread_pool_idle_timeout = 60" ist alles was ich sehe. – mass

+0

@mass Ich habe keine Ahnung. Meine Antwort oben ist 7 Jahre alt und ich habe Tomcat oder Servlet Resource seit ein paar Jahren nicht viel benutzt.Soweit ich das beurteilen kann, ist timeBetweenEvictionRunsMillis eine Eigenschaft des Resource-Tags in context.xml und thread_pool_idle_timeout ist ein .property-Dateischlüssel. –

+0

Im Moment, soweit ich weiß, Einrichten von timeBetweenEvictionRunsMillis startet immer noch die Verbindung Sweeper für jdbc Datenquelle Pool. thread_pool_idle_timeout war jedoch ein MySQL-Parameter, auf den ich mich bezog. Ich bezweifle, dass die aktuellen Standardwerte kürzer als 8 Stunden sind, aber danke, dass ihr trotzdem antwortet. Scheint, als ob die akzeptierte Lösung für das OP funktioniert hat, werde ich es versuchen. – mass

1

Die removeAbandoned-Option ist seit DBCP 1.2 veraltet (in der 1.3-Verzweigung jedoch still present). Here ist eine nicht offizielle Erklärung.