Heim  >  Artikel  >  Datenbank  >  Beispiel dafür, wie JDBC den automatischen Wiederverbindungsmechanismus in MySQL implementiert

Beispiel dafür, wie JDBC den automatischen Wiederverbindungsmechanismus in MySQL implementiert

黄舟
黄舟Original
2017-07-26 15:32:362878Durchsuche

Ich habe kürzlich ein Problem bei der Arbeit entdeckt und es schließlich durch die Suche nach relevanten Informationen gelöst. Der Artikel stellt Ihnen hauptsächlich die relevanten Informationen zur Implementierung des automatischen Wiederverbindungsmechanismus von MySQL vor In Not können Sie sich darauf beziehen, schauen wir uns unten um.

Vorwort

Dieser Artikel stellt Ihnen hauptsächlich den relevanten Inhalt über die JDBC-Implementierung des automatischen Wiederverbindungsmechanismus von MySQL vor und stellt ihn als Referenz zur Verfügung Schauen wir uns die ausführliche Einführung an:

Protokoll: Verwenden Sie die Connector/J-Verbindungseigenschaft „autoReconnect=true“, um dieses Problem zu vermeiden


com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was58129 seconds ago.The last packet sent successfully to the server was 58129 seconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

Nach der Überprüfung stellte sich heraus, dass es sich um ein Problem mit der MySQL-Timeout-Einstellung handelte

Wenn die Verbindung 8 Stunden lang im Leerlauf ist (es werden keine Datenbankoperationen durchgeführt). Innerhalb von 8 Stunden wird MySQL automatisch zum Trennen gestartet. Starten Sie Tomcat neu es an die Verbindungs-URL an. Parameter: autoReconnect=true

Zweitens: Wenn Sie den Ruhezustand verwenden, fügen Sie die folgenden Attribute hinzu:


Dritte Methode: Wenn Sie immer noch den c3p0-Verbindungspool verwenden:
 jdbc.url=jdbc:mysql://ipaddress:3306/database?autoReconnect=true&autoReconnectForPools=true


Vierte Methode: Die schlechteste Lösung
 <property name="connection.autoReconnect">true</property>
 <property name="connection.autoReconnectForPools">true</property>
 <property name="connection.is-connection-validation-required">true</property>

Verwenden Sie Connector /J stellt eine Verbindung zur MySQL-Datenbank her. Nachdem das Programm längere Zeit ausgeführt wurde, wird der folgende Fehler gemeldet:

Fehler bei der Kommunikationsverbindung. Das letzte Paket, das erfolgreich vom Server empfangen wurde, liegt *** Millisekunden zurück Das letzte Paket, das erfolgreich an den Server gesendet wurde, liegt *** Millisekunden zurück.

Der Fehler fordert Sie außerdem auf, „wait_timeout“ zu ändern oder das autoReconnect-Attribut von Connector/J zu verwenden, um diesen Fehler zu vermeiden.
 <property name="hibernate.c3p0.acquire_increment">1</property> 
 <property name="hibernate.c3p0.idle_test_period">0</property> 
 <property name="hibernate.c3p0.timeout">0</property>
 <property name="hibernate.c3p0.validate">true</property>

Nachdem ich einige Informationen überprüft habe, habe ich festgestellt, dass dieses Problem bei vielen Menschen auftritt, wenn die Verbindungspoolmethode verwendet wird .

Der Grund für dieses Problem:

Der standardmäßige „wait_timeout“ des MySQL-Servers beträgt 28800 Sekunden oder 8 Stunden, was bedeutet, dass eine Verbindung länger als inaktiv ist Nach ca. 8 Stunden trennt MySQL die Verbindung automatisch, der Verbindungspool geht jedoch davon aus, dass die Verbindung noch gültig ist (da die Gültigkeit der Verbindung nicht überprüft wurde). Wenn die Anwendung die Verwendung der Verbindung beantragt, wird der oben genannte Fehler verursacht.

⑴. Laut Fehlermeldung können Sie das autoReconnect-Attribut in der JDBC-URL verwenden. Im eigentlichen Test wurde

verwendet, was jedoch möglicherweise nicht funktionierte wahr sein, wie im Internet angegeben. Gilt nur für Versionen vor Version 4.

⑵ Es gibt keine andere Möglichkeit, als die Parameter von MySQL zu ändern. Die maximale Wartezeit beträgt 31536000 oder 1 Jahr. Zu my.cnf hinzufügen:

autoReconnect=true& failOverReadOnly=falseDamit der Neustart wirksam wird, müssen diese beiden Parameter gleichzeitig geändert werden.

Zusammenfassung

[mysqld]

wait_timeout=31536000

interactive_timeout=31536000

Das obige ist der detaillierte Inhalt vonBeispiel dafür, wie JDBC den automatischen Wiederverbindungsmechanismus in MySQL implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn