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:
jdbc.url=jdbc:mysql://ipaddress:3306/database?autoReconnect=true&autoReconnectForPools=true
<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.
<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=false
Damit 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!