Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Nach einigen Bereitstellungszeiten auf dem Server kann keine Verbindung zur Datenbank hergestellt werden

In Ihren Konfigurationseigenschaften haben Sie die c3p0-Eigenschaft maxIdleTime verwendet, aber c3p0-Eigenschaften werden mit c3p0. konfiguriert Präfix oder hibernate.c3p0. . Beachten Sie, dass das Aktivieren von c3p0 properties aktiviert automatisch den entsprechenden Verbindungsanbieter durch Hibernate-Heuristik. Im Log ist nicht ersichtlich, dass du c3p0 verwendest. Wenn Sie keine konfigurierten Datenquellen haben, verwendet Hibernate hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider . Dieser Verbindungsanbieter hat einen eingebauten rudimentären Verbindungspool, für den Sie eine hibernate.connection.pool_size festlegen können , aber es wird nur für Entwicklungszwecke verwendet. Verwenden Sie es niemals in der Produktionsumgebung.

Möglicherweise haben Sie endlose Diskussionen zum Thema How to fix java.net.SocketException:Broken pipe . Nach einiger Zeit werden Sie feststellen, dass Sie offen geblieben sind Verbindungen im Pool, die auf der anderen Seite aus folgenden Gründen plötzlich geschlossen werden:

  • Firewalls oder Router können ungenutzte Verbindungen blockieren (das MySQL-Client/Server-Protokoll pingt nicht).
  • Der MySQL-Server schließt möglicherweise inaktive Verbindungen, die das wait_timeout überschreiten oderinteractive_timeout Schwelle.

Zur Behebung dieser Probleme können die folgenden Tipps verwendet werden:

  • Eine aktuelle (5.1.13+) Version des JDBC-Treibers wird verwendet.
  • Stellen Sie sicher, dass wait_timeout und interactive_timeout ausreichend hoch angesetzt sind. Überprüfen Sie, ob interactiveClient verwendet wird.
  • Stellen Sie sicher, dass tcpKeepalive aktiviert ist.
  • Stellen Sie sicher, dass alle konfigurierbaren Firewall- oder Router-Timeout-Einstellungen die maximal erwartete Leerlaufzeit der Verbindung zulassen.
  • Stellen Sie sicher, dass Verbindungen gültig sind, wenn sie aus dem Verbindungspool verwendet werden. Verwenden Sie eine Abfrage, die mit /* ping */ beginnt um einen leichten Ping anstelle einer vollständigen Abfrage auszuführen. Beachten Sie, dass die Syntax des Ping genau wie hier angegeben sein muss.
  • Überprüfen Sie die Verbindung explizit, bevor Sie sie verwenden, wenn die Verbindung über einen längeren Zeitraum inaktiv war.
  • Minimieren Sie die Dauer, in der ein Verbindungsobjekt inaktiv bleibt, während andere Anwendungslogik ausgeführt wird.

Um einige dieser Optionen zu erfüllen, verwenden Sie besser einen Verbindungspool, den Sie mit Hibernate verwenden können. Hibernate unterstützt commons-dbcp, c3p0 und proxool. Außerdem können Sie die JNDI-Datenquelle auf dem Webserver für die Verwendung mit dem Ruhezustand konfigurieren, sie verfügt über einen Verbindungspool. Siehe Kapitel 7 Verbindungspooling mit Connector/J .

Wenn Sie Hibernate mit c3p0 konfigurieren möchten, sollten Sie diese How-To configure the C3P0 Connection Pool . Eine dbcp-Beispielkonfiguration finden Sie in diesem Beitrag MySQL, Hibernate and Broken Pipe Exception . Welches Verbindungspooling Sie verwenden, bleibt Ihnen überlassen.