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;
}
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:
Befolgen Sie die folgenden Hinweise, um die eine oder eine der beiden zu lösen:
ping
.my.cnf
von MySQL DB.--skip-networking
gestartet wird.Ü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.
Ü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;
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
Hoffe das wird helfen.
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:
[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:
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 ).
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
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?
Stellen Sie sicher, dass das Überspringen in my.cnf/my.ini auskommentiert ist
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).
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.
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.
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.
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!! :)
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.
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.
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.