JDBC Connection pool nicht Wiedereröffnung verbindungen in Tomcat
Habe ich Tomcat verwenden Sie einen Verbindungspool noch nach den MySQL-timeout für die verbindungen die verbindungen, die zuvor öffnen sich in der pool nicht geöffnet. Hier ist, was mein context.xml die Datei sieht wie folgt aus:
<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource"
maxActive="5" maxIdle="3" maxWait="10000"
username="uname" password="password" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/>
Wie Sie sehen können habe ich noch autoReconnect als wahr ist, aber es funktioniert nicht. Ich habe den Vorgang auf der Datenbank nach 8 Stunden, das ist, was die time-out eingestellt ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, eine Validierung Abfrage-Attribut. Dies sollte den Effekt haben, automatisch schließen und erneut öffnen die Verbindung nach einem timeout, wie diese:
testWhileIdle
undtest-on-borrow
Eigenschaften verwenden validationQueryErste, loszuwerden, die
autoReconnect
Eigenschaft. Sie brauchen nicht, dies mit einem connection pool und können Probleme verursachen.Zweite, sicherzustellen, dass Sie schließen alle Ressourcen (
Connection
,Statement
undResultSet
) in JDBC-code in derfinally
block.Ich bin nicht sicher, ob dies gilt in deinem Fall aber ein weit verbreitetes Missverständnis unter den Vorspeisen ist, dass Sie scheinen zu denken, dass Sie nicht brauchen, um in der Nähe dieser Ressourcen im Fall einer zusammengefassten verbindungen. Dies ist unwahr. Eine zusammengefasste Verbindung ist ein wrapper (decorator) um eine Verbindung, die eine leicht geänderte
close()
Methode, die etwa so Aussehen wieMit anderen Worten, schließen Sie befreit bis die zusammengefasste Verbindung, so dass es wieder in den pool für zukünftige Wiederverwendung. Wenn Sie erwerben verbindungen, ohne diese zu schließen, dann ist der pool der verbindungen früher oder später.
Da dieser dringenden und für die Produktion schlage ich vor, Sie schauen mal auf eine anständige connection pool wie c3p0. Es ist robuster und zuverlässiger und kann mit timeouts besser.
Mit Ihrer Konfiguration, es ist eigentlich nicht zu schaffen, eine andere Verbindung, wenn es im Leerlauf ist. Versuchen Sie, fügen Sie
Mit dieser Einstellung DBCP pflegen 3 verbindungen in alle Zeit.
Sehen wir genau das gleiche Verhalten mit einem leicht gebraucht-Servern. Aufgrund der Standard-Verbindungs-timeout von 8 Stunden, wir sehen keine Verbindung, wenn wir kommen in den morgen. Das ist, was wir erwartet haben. Aber manchmal sehen wir veraltete Anschluss und die erste Anforderung wird scheitern. Um dieses Problem müssen Sie fügen Sie folgende Attribute,