Java+Tomcat, Sterben Datenbank-Verbindung?
Frage
Ich habe eine tomcat-Instanz einrichten, aber die Datenbankverbindung ich habe konfiguriert context.xml
hält das sterben nach Perioden der Inaktivität.
Wenn ich die logs bekomme ich folgende Fehlermeldung:
com.mysql.jdbc.Ausnahmen.jdbc4.CommunicationsException:Das Letzte Paket erfolgreich vom server empfangen was68051 Sekunden gemeldet.Das Letzte Paket erfolgreich gesendet an der server wurde 68051 Sekunden vor, die länger ist als der server konfigurierten Wert 'wait_timeout'.Sie sollten entweder auslaufenden und/oder testen Verbindung Gültigkeit vor dem Einsatz in Ihrer Anwendung, die Erhöhung der server konfigurierten Werte für client-timeouts oder mithilfe des Connector/J connection property 'autoReconnect=true' um dieses problem zu vermeiden.
Hier ist die Konfiguration, die 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&useEncoding=true&characterEncoding=UTF-8" />
Ich bin mit autoReconnect=true
wie der Fehler sagt, zu tun, aber die Verbindung hält sterben.Ich habe nie gesehen, dass dies geschieht, bevor.
Ich habe auch überprüft, dass alle Datenbank-verbindungen werden richtig geschlossen.
Lösung
DBCP verwendet die Jakarta-Commons-Datenbank-Verbindungspool.Er 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 bin mit dem gleichen Verbindungs-pooling Zeug, und ich werde diese Eigenschaften verhindern, dass die gleiche Sache, es ist einfach nicht so konfiguriert, durch tomcat.Aber wenn das erste, was nicht funktioniert, versuchen diese.
testWhileIdle=true
timeBetweenEvictionRunsMillis=300000
Andere Tipps
Nur um zu klären, was ist eigentlich die Ursache dieser.MySQL standardmäßig beendet offenen verbindungen nach 8 Stunden der Inaktivität.Allerdings werden die Datenbank-Verbindungs-pool behalten verbindungen für mehr als das.
So durch Einstellung timeBetweenEvictionRunsMillis=300000 weisen Sie die Verbindungs-pool ausgeführt durch Anschlüsse und entfernen, und schließen Sie im Leerlauf alle 5 Minuten.
Die removeAbandoned option ist veraltet, da von DBCP 1.2 (obwohl noch vorhanden in der 1,3-Zweig). Hier's ist eine nicht-offizielle Erklärung.
Ich weiß nicht, ob die obige Antwort ist im Grunde die gleiche Sache, aber einige unserer Systeme verwenden Sie die DB-Verbindung, etwa einmal pro Woche, und ich habe gesehen, dass wir bieten eine -Otimeout flag oder so etwas in der Art zu mysql zu setzen Sie den timeout der Verbindung.