wake-up-neo.com

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Kommunikationsverbindungsfehler

Mein Programm, das eine Verbindung zu einer MySQL-Datenbank herstellt, funktionierte einwandfrei. Dann, ohne den Code zu ändern, der zum Einrichten der Verbindung verwendet wurde, erhalte ich folgende Ausnahme:

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.

Was ist passiert?

Der Code, der für die Verbindung verwendet wird:

private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
    String username = "user";
    String password = "pass";
    String url = "jdbc:mysql://www.domain.com:3306/dbName?connectTimeout=3000";

    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
}
42
Nick Heiner

Dies ist eine umschlossene Ausnahme und nicht wirklich interessant. Es ist die Grundursache der Ausnahme, die uns tatsächlich etwas über die Grundursache sagt. Bitte schauen Sie im Stacktrace etwas weiter. Die Chance ist groß, dass Sie einem SQLException: Connection refused oder SQLException: Connection timed out gegenüberstehen.

Wenn dies auch in Ihrem Fall zutrifft, sind alle möglichen Ursachen:

  1. Die IP-Adresse oder der Hostname in der JDBC-URL ist falsch.
  2. Der Hostname in der JDBC-URL wird vom lokalen DNS-Server nicht erkannt.
  3. Die Portnummer fehlt oder ist in der JDBC-URL falsch.
  4. DB-Server ist inaktiv.
  5. Der DB-Server akzeptiert keine TCP/IP-Verbindungen.
  6. Zwischen Java und DB werden Verbindungen blockiert, z. eine Firewall oder einen Proxy.

Befolgen Sie die folgenden Hinweise, um die eine oder eine der beiden zu lösen:

  1. Überprüfen und testen Sie sie mit ping.
  2. Aktualisieren Sie DNS oder verwenden Sie stattdessen die IP-Adresse in der JDBC-URL.
  3. Überprüfen Sie es basierend auf my.cnf von MySQL DB.
  4. Starten Sie es.
  5. Überprüfen Sie, ob mysqld ohne die Option --skip-networking gestartet wird.
  6. Deaktivieren Sie die Firewall und/oder konfigurieren Sie die Firewall/den Proxy, um den Port zuzulassen/weiterzuleiten.

Übrigens (und nicht im Zusammenhang mit dem eigentlichen Problem) müssen Sie den JDBC-Treiber nicht unbedingt bei jedemgetConnection()-Aufruf laden. Nur einmal beim Start genügt.

37
BalusC

Überprüfen Sie das auf dem DB-Server festgelegte Wartezeitlimit. __ Einige Male ist der Standardwert 10 Sekunden. Dies verliert die Verbindung in 10 Sekunden.

mysql> show global variables like '%time%' ;

aktualisieren Sie es so etwas wie 28800

mysql> SET GLOBAL wait_timeout = 28800;
11
sujit sathe

Ich habe den gleichen Fehler Aber dann habe ich herausgefunden, dass der Mysql-Server nicht läuft zu diesem Zeitpunkt.

So ändern Sie den Status des Servers

  1. Gehen Sie zum Task-Manager
  2. Gehen Sie zu Dienste
  3. suchen Sie dann nach Ihrem MySQL-Server (zB: für meinen Fall sein MySQL56)
  4. dann sehen Sie unter der Statusspalte, dass sie nicht läuft
  5. klicken Sie mit der rechten Maustaste und wählen Sie Start

Hoffe das wird helfen.

5
Rahal Kanishka

Ich habe dieses Problem auch für ungefähr 8-9 Tage gehabt .. Hier ein paar Hintergrundinformationen: Ich entwickle eine einfache Java-Anwendung, die in bash läuft.

Einzelheiten:

  • Frühling 2.5.6
  • Hibernate3.2.3.ga
  • Mit maven . (Die Basis des Projekts ist von mkyong.com, das Frühjahrstutorial ohne Anmerkungen)
  • MySQL-Version:
[jvazquez @ archbox ~] $ mysql --version 
 mysql Ver 14.14 Distrib 5.5.9 für Linux (i686) unter Verwendung von readline 5.1 
 Linux archbox 2.6.37-Arch # 1 SMP PREEMPT Fri Feb 18 16:58 : 42 UTC 2011 i686 Intel (R) -Core (TM) 2-Quad-CPU Q8200 bei 2,33 GHz GenuineIntel GNU/Linux

Die Anwendung funktioniert einwandfrei in Arch Linux, Mac OS X 10.6 und FreeBSD 7.2 .. Wenn ich die JAR-Datei in ein anderes Arch Linux auf einem anderen Host verschoben habe, mit demselben mysql, einer ähnlichen my.cnf und dem ähnlichen Kernel In der Version wurde die Verbindung abgebrochen und derselbe Fehler wie beim ursprünglichen Poster erzielt:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Kommunikationsverbindungsfehler

Ich habe jede mögliche Kombination dafür ausprobiert, die ich in so und den Foren ( http://forums.mysql.com/read.php?39,180347,180347#msg-180347 gefunden habe, die jetzt geschlossen ist und ich kann nicht posten ..), insbesondere:

  • Dreifach prüfen, dass ich kein Überspring-Netzwerk verwendet habe. (verifiziert mit ps aux und my.cnf)
  • Versuchte enable log_warnings = 1 in der my.cnf, aber offensichtlich traf ich den Server nicht, sodass ich während der Verwendung der App nichts gesehen habe
  • SHOW ENGINE innodb STATUS zeigte überhaupt nichts; Während der Tests konnte ich eine Verbindung über Shell herstellen und PHP auch mit dem MySQL-Server verbinden 
  • / etc/hosts hat localhost 127.0.0.1
  • Versuchte die jdbc-Eigenschaften mit localhost und 127.0.0.1 ohne Ergebnisse
  • Versuchte das Hinzufügen von c3p0 und änderte den max_wait 
  • Max-Verbindungen in der my.cnf wurden auf 900, 2000 geändert und noch nichts my.cnf
  • Wait_timeout = 60 my.cnf hinzugefügt
  • Net_wait_timeout = 360 my.cnfhinzugefügt _
  • Die destroy-method = "close" spring.xmlhinzugefügt. _

Wie bereits erwähnt (wenn Sie nach der gleichen Ausnahme suchen, werden Sie mehrere Threads zum Thema Reproduce com.mysql.jdbc.exceptions.jdbc4.CommunicationsException mit einem Setup von Spring, Hibernate und C3P0 finden zum Beispiel ).

  1. Wenn Sie Tomcat verwenden, überprüfen Sie bitte die Sicherheitsausnahme (wieder auf SO, finden Sie sie).
  2. Stellen Sie sicher, dass Sie die von Ihnen verwendete URL auflösen können
  3. Versuchen Sie, c3p0 hinzuzufügen.
  4. Stellen Sie sicher, dass keine Firewall Ihre Verbindungen ablehnt
  5. Wenn Sie schließlich GNU/Linux verwenden (z. B. Arch Linux, und Sie erhalten tatsächlich diese Ausnahme) Try MySQL-Foren :: JDBC und Java :: EOFException: Antwort vom Server kann nicht gelesen werden. Erwartet, 4 Byte zu lesen, 0 Byte zu lesen, bevor die Verbindung unerwartet unterbrochen wurde

Wenn der Link gelöscht wird, fügen Sie einfach mysqld: ALL zu /etc/hosts.allow hinzu

Ich weiß, das ist ein bisschen ausführlich, aber es kann jedem helfen, der GNU/Linux verwendet und diese Ausnahme hat. Dieser Thread schien der beste Ort zu sein, um meine Forschungen zu veröffentlichen.

Ich hoffe es hilft

4

Wir haben eine Software (Webapp mit Tomcat), die Apache Commons Connection Pooling verwendet, und haben jahrelang großartig gearbeitet. Im letzten Monat musste ich die Bibliotheken aufgrund eines alten Fehlers aktualisieren, auf den wir gestoßen sind. Der Fehler wurde in einer aktuellen Version behoben.

Kurz nachdem wir dies implementiert hatten, begannen wir genau diese Nachrichten zu erhalten. Von den Tausenden von Verbindungen, die wir täglich erhalten, würde eine Handvoll (normalerweise unter 10) diese Fehlermeldung erhalten. Es gab kein echtes Muster, es sei denn, sie gruppierten sich manchmal in kleinen Gruppen von 2 bis 5.

Ich habe die Optionen in "Pool" geändert, um die Verbindung jedes Mal zu überprüfen, wenn eine Verbindung aus dem Pool genommen oder wieder in den Pool gestellt wird (wenn eine fehlerhafte gefunden wird, wird stattdessen eine neue generiert), und das Problem ist behoben.

Haben Sie kürzlich Ihr MySQL-Glas aktualisiert? Es scheint, als könnte es eine neue Umgebung geben, die in unserem (zugegebenermaßen sehr alten) Glas nicht vorhanden war.

Ich stimme mit BalusC überein, einige andere Optionen in Ihrer Konfiguration auszuprobieren, beispielsweise diejenigen, die Sie an MySQL übergeben (zusätzlich zum Verbindungs-Timeout).

Wenn dieser Fehler vorübergehender Natur ist und nicht dauerhaft, können Sie ein einfaches try/catch und eine Schleife verwenden, um so lange weiterzumachen, bis alles erfolgreich ist, oder einen Verbindungspool verwenden, um dieses Detail für Sie zu verarbeiten.

Andere Zufallsidee: Ich weiß nicht, was passiert, warum Sie versuchen, eine geschlossene Verbindung zu verwenden (welche Ausnahme Sie erhalten). Könnten Sie die Verbindung irgendwo versehentlich trennen?

3
MBCook

Stellen Sie sicher, dass das Überspringen in my.cnf/my.ini auskommentiert ist

3
PorridgeBear

Wie BalusC erwähnt hat, wäre es sehr nützlich, den vollständigen Stacktrace zu posten (immer einen vollständigen Stacktrace zu posten, es ist nutzlos und frustrierend, nur die ersten Zeilen zu haben eines Stacktraces).

Wie auch immer, Sie erwähnten, dass Ihr Code einwandfrei funktionierte und dass dieses Problem plötzlich auftrat, ohne dass sich der Code änderte. Ich frage mich, ob dies damit zusammenhängen könnte zu deiner anderen Frage Problem mit dem Schließen der Datenbankverbindung während des Debuggens? Wenn dieses Problem während des Debuggens aufgetreten ist, dann denke ich, dass es das ist (du hast keine Verbindungen mehr). Starten Sie in diesem Fall den Datenbankserver neu (und befolgen Sie die Vorschläge der anderen Frage, um diese Situation zu vermeiden).

2
Pascal Thivent

Ich bin auf dasselbe Problem gestoßen. Ich verwende spring & dbcp & mysql 5.5But Wenn ich localhost in 192.168.1.110 ändere, funktioniert alles. Was die Dinge merkwürdiger macht, ist, dass mysql -h localhost einfach funktioniert.

update: Endlich eine Lösung gefunden. Wenn Sie die Bindungsadresse in localhost oder 127.0.0.1 in my.conf ändern, wird das Problem behoben. 

1
LiuJian

In meinem Fall wurde die lokale Loopback-Schnittstelle nicht gestartet, daher konnte "localhost" nicht aufgelöst werden. Sie können dies überprüfen, indem Sie "ifconfig" ausführen. Sie sollten eine Schnittstelle mit dem Namen "lo" sehen. Wenn es nicht aktiv ist, können Sie es aktivieren, indem Sie "ifup lo" oder "ifconfig lo up" ausführen.

0

Das Escential-Problem ist, dass Mysql-JDBC-Pool-Verbindungen nicht verwendet werden. Schließen Sie anschließend die Timeouts von Mysql. Sie müssen die Pool-Parameter ändern, um die Verbindung erneut aufzurufen, wenn die Verbindung fehlerhaft ist. Gehen Sie dazu folgendermaßen vor:

Connection Validation: Erforderlich (Prüfen)
Validation Method: autocommit

Sie können die Validierungsmethode ändern, wenn sie nicht funktioniert.

Ich habe den Kommunikationsfehlerfehler erhalten, wenn ich eine Java.sql.PreparedStatement mit einer bestimmten Anweisung verwende. 

Dies lief gegen MySQL 5.6, Tomcat 7.0.29 und JDK 1.7.0_67 auf einem Windows 7 x64-Computer. 

Es stellte sich heraus, dass die Ursache darin lag, dass eine Ganzzahl auf einen String-Parameter und eine Zeichenfolge auf einen Integer-Parameter gesetzt wurde. Anschließend wurde versucht, executeQuery für die vorbereitete Anweisung auszuführen. Nachdem ich die Reihenfolge der Parametrierung korrigiert hatte, wurde die Anweisung korrekt ausgeführt.

Dies hatte nichts mit Netzwerkproblemen zu tun, wie der Wortlaut der Fehlermeldung andeutete.

0
Will Marsh

Ich sehe, dass Sie sich mit einem Remote-Host verbinden. Nun stellt sich die Frage, welche Art von Netzwerk Sie verwenden, um eine Verbindung zum Internet herzustellen. 

WINDOWS

Wenn es sich um ein mobiles Breitbandgerät handelt, rufen Sie die IP-Adresse Ihres Computers an und fügen Sie sie Ihrem Hosting-Server hinzu, damit Ihr Host-Server Verbindungen von Ihrem Computer zulässt. Beachten Sie, dass sich Ihre IP jedes Mal ändert, wenn Sie ein anderes Netzwerkgerät verwenden.

Wenn Sie ein LAN verwenden, legen Sie eine statische IP-Adresse auf Ihrem Computer fest und fügen Sie sie Ihrem Host hinzu. 

Ich hoffe das hilft!! :)

0
21stking

In meinem Fall hatte der mysql.com heruntergeladene Connector/J 5.1.29 .jar diesen Fehler , wohingegen der 5.1.29 .jar, der vom MvnRepository heruntergeladen wurde, nicht hatte.

Dies geschah beim Erstellen einer Google-Anwendungsanwendung in Android Studio (Gradle, Windows x64), die mit einem Linux-MySQL-Server im lokalen Netzwerk/der lokalen VM kommuniziert.

0
mstrthealias

Ich hatte das gleiche Problem und benutzte die meisten Parameter (Autoreconnect usw.), versuchte es jedoch nicht (test_on_idle oder test_on_connect). Ich werde sie als nächstes tun.

Allerdings hatte ich diesen Hack, der mich durch dieses Problem brachte: 

Ich habe einen Cron-Job namens Healthcheck, der alle 10 Minuten aufwacht und einen REST - API-Aufruf an den Server ausführt. Der Web-/App-Server greift dies auf, stellt eine Verbindung zur Datenbank her, nimmt eine kleine Änderung vor und kehrt mit "Ja, alles in Ruhe an der Westfront" oder "Shitshappening" zurück. Bei letzterem wird eine Pager/E-Mail an die richtigen Personen gesendet.

Es hat den Nebeneffekt, dass der DB-Verbindungspool immer aktuell bleibt. Solange dieser Cron läuft, habe ich keine Probleme mit der DB-Zeitüberschreitung. sonst tauchen sie auf.

0
Sree

Wenn Sie WAMP verwenden, stellen Sie sicher, dass es online ist. Was ich tat, war, zuerst meine Firewall auszuschalten, dann funktionierte es, und danach erlaubte ich die Verbindung für alle lokalen Ports, insbesondere Port 80. Als ich dieses Problem gelöst hatte. Für mich war es die Firewall, die die Verbindung blockierte.

0