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

Beheben eines Kommunikationsverbindungsfehlers mit JDBC und MySQL

Ich hatte das gleiche Problem in zwei meiner Programme. Mein Fehler war dieser:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Ich habe mehrere Tage damit verbracht, dieses Problem zu lösen. Ich habe viele Ansätze getestet, die auf verschiedenen Websites erwähnt wurden, aber keiner davon hat funktioniert. Schließlich änderte ich meinen Code und fand heraus, was das Problem war. Ich werde versuchen, Ihnen verschiedene Ansätze aufzuzeigen und sie hier zusammenzufassen .

Als ich im Internet nach einer Lösung für diesen Fehler gesucht habe, habe ich herausgefunden, dass es viele Lösungen gibt, die bei mindestens einer Person funktioniert haben, aber andere sagen, dass es bei ihnen nicht funktioniert! Warum gibt es viele Ansätze für diesen Fehler? Es scheint, dass dieser Fehler allgemein auftreten kann wenn es ein Problem bei der Verbindung zum Server gibt . Möglicherweise liegt das Problem an der falschen Abfragezeichenfolge oder an zu vielen Verbindungen zur Datenbank.

Daher empfehle ich Ihnen, alle Lösungen nacheinander auszuprobieren und nicht aufzugeben!

Hier sind die Lösungen, die ich im Internet gefunden habe, und für jede von ihnen gibt es mindestens eine Person, deren Problem mit dieser Lösung gelöst wurde.

Tipp:Die Lösungen, die Sie zum Ändern der MySQL-Einstellungen benötigen, finden Sie in den folgenden Dateien:

  • Linux:/etc/mysql/my.cnf oder /etc/my.cnf (abhängig von der Linux-Distribution und dem verwendeten MySQL-Paket)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Beachten Sie, dass es sich um ProgramData handelt, nicht um Program Files)

Hier sind die Lösungen:

  • Ändern der bind-address Attribut:

    Entkommentieren Sie bind-address Attribut oder ändern Sie es in eine der folgenden IPs:

     bind-address="127.0.0.1"
    

    oder

     bind-address="0.0.0.0"
    
  • "Skip-Networking" auskommentieren

    Wenn es ein skip-networking gibt Zeile in Ihrer MySQL-Konfigurationsdatei auskommentieren, indem Sie # hinzufügen Zeichen am Anfang dieser Zeile.

  • „wait_timeout“ und „interactive_timeout“ ändern

    Fügen Sie diese Zeilen zur MySQL-Konfigurationsdatei hinzu:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Stellen Sie sicher, dass Java „localhost“ nicht in [:::1] statt in [127.0.0.1] übersetzt

    Da MySQL 127.0.0.1 erkennt (IPv4 ), aber nicht :::1 (IPv6 )

    Dies könnte durch einen von zwei Ansätzen vermieden werden:

    1. Verwenden Sie in der Verbindungszeichenfolge 127.0.0.1 statt localhost um localhost zu vermeiden übersetzt in :::1

    2. Führen Sie Java mit der Option -Djava.net.preferIPv4Stack=true aus um Java zu zwingen, IPv4 zu verwenden statt IPv6 . Unter Linux könnte dies auch durch Ausführen (oder Platzieren in /etc/profile) erreicht werden :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • Prüfen Sie die Proxy-Einstellungen des Betriebssystems, Firewalls und Antivirenprogramme

    Stellen Sie sicher, dass die Firewall oder Antivirensoftware den MySQL-Dienst nicht blockiert.

    Stoppen Sie iptables vorübergehend unter Linux. Wenn iptables falsch konfiguriert sind, können sie zulassen, dass TCP-Pakete an den mysql-Port gesendet werden, aber TCP-Pakete daran hindern, auf derselben Verbindung zurückzukommen.

     # Redhat enterprise and CentOS
     systemctl stop iptables.service
     # Other linux distros
     service iptables stop
    

    Beenden Sie die Antivirensoftware unter Windows.

  • Verbindungszeichenfolge ändern

    Überprüfen Sie Ihre Abfragezeichenfolge. Ihre Verbindungszeichenfolge sollte in etwa so aussehen:

    dbName = "my_database";
    dbUserName = "root";
    dbPassword = "";
    String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
    

Stellen Sie sicher, dass Ihre Zeichenfolge keine Leerzeichen enthält. Die gesamte Verbindungszeichenfolge sollte ohne Leerzeichen fortgesetzt werden.

Versuchen Sie, „localhost“ durch die Loopback-Adresse 127.0.0.1 zu ersetzen. Versuchen Sie auch, Ihrer Verbindungszeichenfolge eine Portnummer hinzuzufügen, wie:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

Normalerweise ist der Standardport für MySQL 3306.

Vergessen Sie nicht, den Benutzernamen und das Passwort in den Benutzernamen und das Passwort Ihres MySQL-Servers zu ändern.

  • Aktualisieren Sie Ihre JDK-Treiberbibliotheksdatei
  • Testen Sie verschiedene JDK und JREs (wie JDK 6 und 7)
  • max_allowed_packet nicht ändern

"max_allowed_packet " ist eine Variable in der MySQL-Konfigurationsdatei, die die maximale Paketgröße angibt, nicht die maximale Anzahl von Paketen. Daher hilft es nicht, diesen Fehler zu beheben.

  • Tomcat-Sicherheit ändern

Ändern Sie TOMCAT6_SECURITY=yes in TOMCAT6_SECURITY=no

  • ValidationQuery-Eigenschaft verwenden

Verwenden Sie ValidationQuery="select now()", um sicherzustellen, dass jede Abfrage Antworten hat

  • AutoReconnect

Fügen Sie diesen Code zu Ihrer Verbindungszeichenfolge hinzu:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

Obwohl keine dieser Lösungen für mich funktioniert hat, empfehle ich Ihnen, sie auszuprobieren. Weil es einige Leute gibt, die ihr Problem mit diesen Schritten gelöst haben.

Aber was hat mein Problem gelöst?

Mein Problem war, dass ich viele SELECTs in der Datenbank hatte. Jedes Mal habe ich eine Verbindung erstellt und dann geschlossen. Ich habe zwar jedes Mal die Verbindung geschlossen, aber das System war mit vielen Verbindungen konfrontiert und gab mir diesen Fehler. Ich habe meine Verbindungsvariable als öffentliche (oder private) Variable für die gesamte Klasse definiert und im Konstruktor initialisiert. Dann habe ich jedes Mal nur diese Verbindung benutzt. Es löste mein Problem und erhöhte auch meine Geschwindigkeit dramatisch.

#Schlussfolgerung#Es gibt keinen einfachen und eindeutigen Weg, dieses Problem zu lösen. Ich empfehle Ihnen, über Ihre eigene Situation nachzudenken und die oben genannten Lösungen zu wählen. Wenn Sie diesen Fehler zu Beginn des Programms erhalten und überhaupt keine Verbindung zur Datenbank herstellen können, liegt möglicherweise ein Problem in Ihrer Verbindungszeichenfolge vor. Aber wenn Sie diesen Fehler nach mehreren erfolgreichen Interaktionen mit der Datenbank nehmen, könnte das Problem mit der Anzahl der Verbindungen liegen und Sie könnten darüber nachdenken, "wait_timeout" und andere MySQL-Einstellungen zu ändern oder Ihren Code umzuschreiben, wie dies die Anzahl der Verbindungen reduziert.