Verbindung zu MySQL über JDBC-Connector über Tomcat oder extern nicht möglich

17

Ich habe eine Standard-Installation von mysql 5.5 installiert. Obwohl ich über den Befehl mysql eine Verbindung zum mysql-Dienst herstellen kann und der Dienst anscheinend ausgeführt wird, kann ich keine Verbindung über spring + tomcat oder einen externen JDBC-Connector herstellen.

Ich benutze die folgende URL:

jdbc:mysql://myserver.com:myport/mydb

mit dem richtigen Benutzernamen / Passwort, aber ich erhalte die folgende Nachricht:

server.com: 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.

und Kater wirft:

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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

Das scheint dasselbe Problem zu sein, als würde ich versuchen, eine externe Verbindung herzustellen.

Stefan Kendall
quelle
Ich war mit diesem Problem konfrontiert, als ich versuchte, über Java eine Verbindung zu meiner MySQL-Datenbank herzustellen, die auf einem anderen Server in meinem LAN ausgeführt wird. Bei der Ausführung des gleichen Java-Programms auf dem Server, auf dem MySQL ausgeführt wird, war die Verbindung ohne Probleme. Von der externen Maschine aus konnte ich zum Beispiel mit SQLYog eine Verbindung zur MySQL-Datenbank herstellen (obwohl ich zuerst die Datei my.cnf ändern musste, um sie an 0.0.0.0 anstatt an 127.0.0.1 zu binden). Bodens Antwort und der Kommentar zum Ändern des JDBC-Konnektors wiesen mich in die richtige Richtung. Ich habe den JDBC-Connector auf die neueste Version geändert und plötzlich hat es funktioniert!
user2380870

Antworten:

18

Dies kann verschiedene Gründe haben. Ich habe es vor ein paar Wochen selbst gesehen, aber ich kann mich nicht erinnern, was für eine Lösung das für mich war.

1) Vergewissern Sie sich, dass die Adresse, an die mysql gebunden ist, wahrscheinlich 127.0.0.1 (nur) ist, was meines Erachtens die Standardadresse ist (zumindest auf Standard-Ubuntu-Servern). Sie müssen den Parameter bind-address in my.cnf auskommentieren, um an alle verfügbaren Adressen zu binden (Sie können nicht mehrere auswählen, es ist eine oder alle).

2) Wenn es an 127.0.0.1 gebunden ist und Sie keine Verbindung mit "localhost" herstellen können, stellen Sie sicher, dass es nicht in die IPv6 localhost-Adresse anstelle von IPv4 aufgelöst wird. (oder benutze einfach die IP-Adresse)

3) Überprüfen Sie den Port, den MySQL abhört, doppelt und dreifach.

4) Stellen Sie sicher, dass Sie den richtigen JDBC-Connector für Ihr JDK verwenden.

5) Stellen Sie sicher, dass Sie nichts wirklich Dummes tun, wie mysql mit --skip-networking zu starten.

Ich denke, mein erster Vorschlag ist der vielversprechendste ... in der Tat denke ich, dass ich ihn kürzlich dort gesehen habe ... Ich habe versucht, eine Remoteverbindung zu mysql herzustellen (auch unter Ubuntu 8.04).

Boden
quelle
Nur um meine 2 Cent hinzuzufügen, funktionierte der 4. für mich. Vielen Dank!
Janis Peisenieks
1
In Bezug auf "Sie müssen den Parameter bind-address in my.cnf auskommentieren, um an alle verfügbaren Adressen zu binden" wird standardmäßig nur localhost überwacht. Daher müssen Sie möglicherweise die Zeile "bind-address = 0.0" verwenden. 0.0 "in [mysqld].
Palo
13

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

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 verbringe einige Tage damit, dieses Problem zu lösen. Ich habe viele Ansätze getestet, die auf verschiedenen Websites erwähnt wurden, von denen jedoch keiner funktioniert hat. Schließlich habe ich meinen Code geändert und herausgefunden, wo das Problem liegt. Ich werde versuchen, Sie über verschiedene Ansätze zu informieren und sie hier zusammenzufassen .

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

Deshalb empfehle ich Ihnen, alle Lösungen einzeln 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, die sein Problem mit dieser Lösung gelöst hat.

point: Für die Lösungen, die Sie zum Ändern der MySQL-Einstellungen benötigen, können Sie sich auf Folgendes nicht beziehen:

  • Linux: /etc/my.cnf

  • Windows: D: \ Programme \ mysql \ bin \ my.ini

Hier sind die Lösungen:

  • Ändern des Attributs "Bindeadresse"

Dekommentieren Sie das Attribut "Bindeadresse" oder ändern Sie es in eines der folgenden IPS:

Bindeadresse = "127.0.0.1"

oder

Bindeadresse = "0.0.0.0"

  • "skip-networking" auskommentieren

Wenn sich in Ihrer MySQL-Konfigurationsdatei eine Zeile zum Überspringen von Netzwerken befindet, kommentieren Sie diese, indem Sie am Anfang dieser Zeile ein "#" - Zeichen einfügen.

  • ändere "wait_timeout" und "interactive_timeout"

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

wait_timeout = number

interactive_timeout = number

connect_timeout = number

  • Überprüfen Sie die Proxy-Einstellungen des Betriebssystems

Stellen Sie sicher, dass die Firewall oder die Anti-Virus-Software den MySQL-Dienst nicht blockieren.

  • Verbindungszeichenfolge ändern

Überprüfen Sie Ihre Abfragezeichenfolge. Ihre Verbindungszeichenfolge sollte 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 Ihren Port zu ersetzen, z. B. 127.0.0.1. Versuchen Sie auch, der Verbindungszeichenfolge eine Portnummer hinzuzufügen, z.

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
  • Teste verschiedene JDKs und JREs (wie JDK 6 und 7)
  • Ändere nicht max_allowed_packet

" max_allowed_packet " ist eine Variable in der MySQL-Konfigurationsdatei, die die maximale Paketgröße und nicht die maximale Anzahl von Paketen angibt. Es wird also nicht helfen, diesen Fehler zu beheben.

  • Tomcat-Sicherheit ändern

Ändern Sie TOMCAT6_SECURITY = yes in TOMCAT6_SECURITY = no

  • Verwenden Sie die validationQuery -Eigenschaft

Verwenden Sie validationQuery = "select now ()", um sicherzustellen, dass jede Abfrage Antworten enthält

  • AutoReconnect

Fügen Sie diesen Code 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 sie 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 diese Verbindung benutzt. Es löste mein Problem und erhöhte auch meine Geschwindigkeit dramatisch.

Fazit

Es gibt keinen einfachen und einzigartigen Weg, um dieses Problem zu lösen. Ich empfehle Ihnen, über Ihre eigene Situation nachzudenken und die oben genannten Lösungen zu wählen. Wenn Sie diese Fehlermeldung zu Beginn des Programms erhalten und überhaupt keine Verbindung zur Datenbank herstellen können, liegt möglicherweise ein Problem in Ihrer Verbindungszeichenfolge vor. Wenn Sie diesen Fehler jedoch nach mehreren erfolgreichen Interaktionen mit der Datenbank erhalten, liegt das Problem möglicherweise bei der Anzahl der Verbindungen. Möglicherweise möchten Sie "wait_timeout" und andere MySQL-Einstellungen ändern oder Ihren Code neu schreiben, um die Anzahl der Verbindungen zu verringern.

Soheil
quelle
Ich hatte auch dieses Problem! Aber ich hatte zuerst Mysql geändert, um Port 8888 statt 3306 zu hören. Also, @ Sohails Antwort half, ich fügte nur Port 8888 zu meinem Uri hinzu und es funktionierte! Vielen Dank
Das hat das Problem für mich gelöst! Bei unserem Vagrant Homestead-Setup war es aus irgendeinem Grund an die Adresse gebunden, die der VM (in meinem Fall 10.0.2.15) anstelle von localhost zugewiesen wurde.
Lander
1

Wenn Sie eine Linux-Installation ausführen, blockiert Lokkit wahrscheinlich eingehende Kommunikationen, außer über SSH.

Melden Sie sich als root an und führen Sie den Befehl lokkit an der Eingabeaufforderung aus. Deaktivieren Sie die Firewall und SElinux, und überprüfen Sie, ob das gleiche Problem vorliegt.

Überprüfen Sie auch, ob Ihre Berechtigungen korrekt festgelegt wurden, damit alles an den richtigen Speicherort geschrieben werden kann.

Stephen Thompson
quelle
Ich verwende Ubuntu 8.04. Ich hätte das wahrscheinlich erwähnen sollen. Haben Sie spezielle Anweisungen für diese Distribution? Ich werde gleich googeln, aber ich dachte, ich würde zuerst fragen.
Stefan Kendall
sudo ufw disable deaktiviert die Ubuntu Firewall
Stephen Thompson
Ich habe ufw installiert und versucht, den Port zu aktivieren, aber keine Würfel.
Stefan Kendall
ufw und iptables wurden bereits deinstalliert. Ich dachte, ufw sei ein Management-Tool, das separat installiert werden musste. Sicher genug, "iptables" liefert keinen solchen Befehl, und es scheint, dass kein iptables-Dienst ausgeführt wird.
Stefan Kendall
Ok, schließlich habe ich oft festgestellt, dass Sie mysql nicht in die Lage versetzen, auf die eth0-Schnittstelle zu lauschen, und oft nur auf die localhost-Schnittstelle. Versuche Folgendes. Ändern Sie jdbc: mysql: //myserver.com: myport / mydb in jdbc: mysql: // localhost: myport / mydb. Wenn dies funktioniert, müssen Sie Folgendes tun: dev.mysql.com/doc/refman/5.1/en/ can-not-connect-to-server.html
Stephen Thompson
1

Dies kann auch durch falsche Proxy-Einstellungen verursacht werden . Ich hatte dieses Problem beim Versuch, über jdbc eine Verbindung zu einer MySQL-Instanz herzustellen, die in einer virtuellen Parallels-Appliance auf meinem Mac ausgeführt wird. Die jdbc-Verbindung verwendet die Netzwerkeinstellungen auf Systemebene. Da ich mich hinter einem SOCKS-Proxy befand, musste ich den MySql-Host als Nicht-Proxy-Host festlegen (z. B. auf einem Mac können Sie dies unter Einstellungen-> Netzwerk-> Erweitert- konfigurieren. > Proxies und fügen Sie schließlich den Hostnamen oder die IP-Adresse unter "Proxy-Einstellungen für diese Hosts und Domains umgehen" hinzu.

Simone Bruno
quelle
1

MySQL Connector / J unterstützt nur TCP / IP. Java unterstützt keine Konnektivität mit Unix-Domain-Sockets

Wenn MYSQL mit dem Flag "Netzwerk überspringen" gestartet wird oder wenn MySQL hinter der Firewall ausgeführt wird, ist die TCP / IP-Option deaktiviert. Damit Java nicht mit MySQL kommunizieren kann.

Sankar.lp.gym
quelle
0

Ich hatte fast einen Tag lang ein sehr ähnliches Problem und es machte mich verrückt! Aber ich habe es geschafft, die Lösung zu finden, und es war sehr, sehr einfach, Sie müssen nur /etc/init.d/tomcat6, um TOMCAT6_SECURITY = yes zu TOMCAT6_SECURITY = no zu ändern. es ist nicht meine lösung, ich habe sie hier gefunden , wie ihr sehen könnt, ich lasse ubuntu laufen, hoffe das funktioniert.


quelle
0

Ich hatte das gleiche problem Die Eigenschaft "bind-address" in der Datei /etc/mysql/my.cnf wurde in 0.0.0.0 geändert und funktioniert. Die entsprechende Zeile in my.cnf sieht folgendermaßen aus:

Bindeadresse = 0.0.0.0

Bevor es auf die externe IP-Adresse des Servers gesetzt wurde, sah es ungefähr so ​​aus:

Bindeadresse = 196.152.4.145

Ich denke, wenn es auf die externe IP-Adresse und nicht die Localhost-Schleife eingestellt ist, ist MySQL-Server nur mit der Netzwerkkarte verbunden und hört nicht auf die Verbindungen von der lokalen Schleife.


quelle
0

Versuchen Sie Ihre lokale Adresse, um die Adresse in der Datei my.cnf zu binden

Verbindung con = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
ozgun bayrak
quelle