Résoudre une “défaillance de liaison de communication” avec JDBC et MySQL

J’essaie de me connecter au serveur MySQL local mais je continue à recevoir une erreur.

Voici le code

public class Connect { public static void main(Ssortingng[] args) { Connection conn = null; try { Ssortingng userName = "myUsername"; Ssortingng password = "myPassword"; Ssortingng url = "jdbc:mysql://localhost:3306/myDatabaseName"; Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, userName, password); System.out.println("Database connection established"); } catch (Exception e) { System.err.println("Cannot connect to database server"); System.err.println(e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); System.out.println("Database Connection Terminated"); } catch (Exception e) {} } } } } 

et les erreurs:

 Cannot connect to database server 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. 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. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at Connect.main(Connect.java:16) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at java.net.Socket.connect(Socket.java:478) at java.net.Socket.(Socket.java:375) at java.net.Socket.(Socket.java:218) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:294) ... 15 more 

J’ai défini le chemin de classe, je me suis assuré que my.cnf avait l’option ignorer le réseau.

la version java est 1.2.0_26 (64 bit) mysql 5.5.14 mysql connector 5.1.17

Je me suis assuré que l’utilisateur avait access à ma firebase database.

J’ai eu le même problème dans deux de mes programmes. Mon erreur était la suivante:

 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. 

J’ai passé plusieurs jours pour résoudre ce problème. J’ai testé de nombreuses approches qui ont été mentionnées sur différents sites Web, mais qui n’ont pas fonctionné. Finalement, j’ai changé mon code et découvert quel était le problème. Je vais essayer de vous parler de différentes approches et de les résumer ici .

Alors que je cherchais Internet pour trouver la solution à cette erreur, je me suis rendu compte que de nombreuses solutions fonctionnaient pour au moins une personne, mais d’autres disent que cela ne fonctionne pas pour eux! pourquoi il y a beaucoup d’approches à cette erreur? Il semble que cette erreur puisse se produire généralement en cas de problème de connexion au serveur . Le problème est peut-être dû à une chaîne de requête incorrecte ou à un trop grand nombre de connexions à la firebase database.

Je vous suggère donc d’essayer toutes les solutions une par une et de ne pas baisser les arm!

Voici les solutions que j’ai trouvées sur Internet et pour chacune d’entre elles, il ya au moins une personne qui a résolu son problème avec cette solution.

Conseil: Pour les solutions dont vous avez besoin pour modifier les parameters MySQL, vous pouvez vous reporter aux fichiers suivants:

  • Linux: /etc/mysql/my.cnf ou /etc/my.cnf (selon la dissortingbution Linux et le package MySQL utilisé)

  • Windows: C: ** ProgramData ** \ MySQL \ MySQL Server 5.6 \ my.ini (notez que ProgramData, pas Program Files)

Voici les solutions:

  • changer l’atsortingbut “bind-address”

Décommentez l’atsortingbut “bind-address” ou changez-le en l’une des adresses IP suivantes:

bind-address = “127.0.0.1”

ou

bind-address = “0.0.0.0”

  • commentant le “saut de réseau”

Si votre ligne de configuration MySQL contient une ligne “skip-networking”, faites-la en ajoutant le signe “#” au début de cette ligne.

  • changer “wait_timeout” et “interactive_timeout”

Ajoutez ces lignes au fichier de configuration MySQL:

wait_timeout = nombre

interactive_timeout = nombre

connect_timeout = nombre

  • Assurez-vous que Java ne traduit pas ‘localhost’ à [::: 1] au lieu de [127.0.0.1]

Depuis que MySQL reconnaît 127.0.0.1 (IPv4) mais pas ::: 1 (IPv6)

Cela pourrait être évité en utilisant l’une des deux approches suivantes:

Option n ° 1: Dans la chaîne de connexion, utilisez 127.0.0.1 au lieu de localhost pour éviter que localhost ne soit traduit en ::: 1

Option n ° 2: exécutez java avec l’option -Djava.net.preferIPv4Stack = true pour forcer java à utiliser IPv4 au lieu d’IPv6. Sous Linux, cela pourrait également être réalisé en exécutant (ou en le plaçant dans / etc / profile:

 export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true" 
  • vérifier les parameters proxy du système d’exploitation, les pare-feu et les programmes antivirus

Assurez-vous que le pare-feu ou le logiciel anti-virus ne bloque pas le service MySQL.

Arrêtez iptables temporairement sur Linux. Si iptables est mal configuré, ils peuvent autoriser l’envoi de paquets TCP sur le port mysql, mais empêcher les paquets TCP de revenir sur la même connexion.

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

Arrêtez le logiciel anti-virus sous Windows.

  • changer la chaîne de connexion

Vérifiez votre chaîne de requête. votre chaîne de connexion devrait être quelque chose comme ceci:

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

Assurez-vous de ne pas avoir d’espaces dans votre chaîne. Toute la chaîne de connexion doit être continue sans aucun espace.

Essayez de remplacer “localhost” par l’adresse de bouclage 127.0.0.1. Essayez également d’append un numéro de port à votre chaîne de connexion, par exemple:

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

Le port par défaut pour MySQL est généralement 3306.

N’oubliez pas de changer le nom d’utilisateur et le mot de passe pour le nom d’utilisateur et le mot de passe de votre serveur MySQL.

  • mettre à jour votre fichier de bibliothèque de pilotes JDK
  • tester différents JDK et JRE (comme JDK 6 et 7)
  • ne changez pas max_allowed_packet

” max_allowed_packet ” est une variable dans le fichier de configuration MySQL qui indique la taille maximale des paquets et non le nombre maximal de paquets. Donc, cela ne va pas aider à résoudre cette erreur.

  • changer la sécurité tomcat

changez TOMCAT6_SECURITY = yes en TOMCAT6_SECURITY = no

  • utiliser la propriété validationQuery

utilisez validationQuery = “select now ()” pour vous assurer que chaque requête a des réponses

  • Reconnexion automatique

Ajoutez ce code à votre chaîne de connexion:

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

Bien que ces solutions n’aient pas fonctionné pour moi, je vous suggère de les essayer. Parce que certaines personnes ont résolu leur problème en suivant ces étapes.

Mais qu’est-ce qui a résolu mon problème?

Mon problème était que j’avais beaucoup de SELECT sur la firebase database. Chaque fois que je créais une connexion, puis la fermais. Bien que je fermais la connexion à chaque fois, mais le système était confronté à de nombreuses connexions et m’a donné cette erreur. Ce que j’ai fait, c’est que j’ai défini ma variable de connexion en tant que variable publique (ou privée) pour la classe entière et l’a initialisée dans le constructeur. Ensuite, chaque fois que je viens d’utiliser cette connexion. Cela a résolu mon problème et a considérablement augmenté ma vitesse.

Conclusion

Il n’y a pas de moyen simple et unique pour résoudre ce problème. Je vous suggère de réfléchir à votre propre situation et de choisir les solutions ci-dessus. Si vous prenez cette erreur au début du programme et que vous ne parvenez pas à vous connecter à la firebase database, vous risquez d’avoir des problèmes avec votre chaîne de connexion. Mais si vous prenez cette erreur après plusieurs interactions réussies avec la firebase database, le problème peut être lié au nombre de connexions et vous pouvez envisager de modifier “wait_timeout” et d’autres parameters MySQL ou réécrire votre code pour réduire le nombre de connexions.

Si vous utilisez MAMP PRO, la solution facile, que j’aurais bien voulu réaliser avant de commencer à chercher sur Internet pendant des jours, essayant de le comprendre. C’est vraiment aussi simple …

Il vous suffit de cliquer sur “Autoriser l’access réseau à MySQL” à partir de l’onglet MySQL MAMP.

Vraiment, c’est ça.

Oh, et vous devrez peut-être encore changer votre adresse de liaison en 0.0.0.0 ou 127.0.0.1 comme indiqué dans les articles ci-dessus, mais cliquer sur cette case seule résoudra probablement vos problèmes si vous êtes un utilisateur de MAMP.

La définition de l’ bind-address de bind-address IP réseau du serveur au lieu du défaut localhost, et la définition de privilèges sur mon utilisateur a fonctionné pour moi.

my.cnf:

 bind-address = 192.168.123.456 

MySql Console:

 GRANT ALL PRIVILEGES ON dbname.* to username@'%' IDENTIFIED BY 'password'; 

Comme le dit la réponse détaillée ci-dessus, cette erreur peut être causée par de nombreuses choses.

J’ai eu ce problème également. Ma configuration était Mac OSX 10.8, utilisant une VM VirtualBox gérée par Ubuntu 12.04, avec MySQL 5.5.34.

J’ai correctement configuré la redirection de port dans le fichier de configuration Vagrant. Je pouvais me connecter à l’instance MySQL depuis mon Mac et depuis la VM. Je savais donc que le démon MySQL était en cours d’exécution et accessible. Mais quand j’ai essayé de me connecter via JDBC, j’ai eu l’erreur “Communications link failure”.

Dans mon cas, le problème a été résolu en éditant le fichier /etc/mysql/my.cnf. Plus précisément, j’ai commenté la ligne “# bind-address = 127.0.0.1”.

Dans mon cas, il s’agissait d’un délai d’inactivité qui entraînait la suppression de la connexion sur le serveur. La connexion a été maintenue ouverte, mais n’a pas été utilisée pendant une longue période. Ensuite, un client redémarre, alors que je pense qu’une reconnexion fonctionnera également.

Une mauvaise solution consiste à avoir un démon / service pour exécuter un ping sur la connexion de temps en temps.

Dans mon cas,

  1. Changez la configuration mysql de la machine distante dans /etc/mysql/my.cnf : changez l’ bind-address = 127.0.0.1 en #bind-address = 127.0.0.1

  2. Sur la machine distante, modifiez les permissions utilisateur mysql avec GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';

  3. IMPORTANT: redémarrez mysql sur la machine distante: sudo /etc/init.d/mysql restart

Pour moi, la solution était de changer le paramètre bind-address = “127.0.0.1” ou bind-address = “xxxx” en bind-address = “0.0.0.0” dans le fichier conf du serveur mysql. Merci.

Je viens de faire face au même problème. Cela est arrivé parce que le démon MySQL était lié à l’adresse IP de la machine, ce qui est nécessaire pour établir la connexion avec un utilisateur autorisé à se connecter à @your_machine. Dans ce cas, l’utilisateur doit être autorisé à se connecter à USER_NAME @ MACHINE_NAME_OR_IP.

Je voulais un access à distance à ma machine, donc j’ai changé dans my.cnf à partir de

 bind-address = MY_IP_ADDRESS 

À

 bind-address = 0.0.0.0 

Ce qui permettra à un utilisateur de localhost ET même en dehors (dans mon cas) de se connecter à l’instance. Les deux permissions ci-dessous fonctionneront si vous liez MySQL à 0.0.0.0:

 USER_NAME@MACHINE_NAME_OR_IP USER_NAME@localhost 

Dans mon cas (je suis un noob), je testais Servlet qui établit la connexion à la firebase database avec MySQL et l’une des exceptions est celle mentionnée ci-dessus.

Cela m’a fait bouger la tête pendant quelques secondes mais je me suis rendu compte que c’était parce que je n’avais pas démarré mon serveur MySQL dans localhost .
Après le démarrage du serveur, le problème a été résolu.

Donc, vérifiez si le serveur MySQL fonctionne correctement .

Cela arrive (dans mon cas) quand il n’y a pas assez de mémoire pour MySQL. Un redémarrage le corrige, mais si tel est le cas, considérez une nachine avec plus de mémoire, ou limitez la mémoire prise par jvms

Accédez aux services Windows dans le panneau de configuration et démarrez le service MySQL. Pour moi, cela a fonctionné. Lorsque je faisais un projet Java EE, j’ai eu cette erreur “Echec du lien de communication”. J’ai redémarré mon système puis cela a fonctionné.

Après cela, j’ai encore eu la même erreur, même après avoir redémarré mon système. Ensuite, j’ai essayé d’ouvrir la console de ligne de commande MySQL et de me connecter avec root, même si cela m’a donné une erreur.

Enfin, lorsque j’ai commencé le service MySQL à partir des services Windows, cela a fonctionné.

Eu le même. Supprimer le port a aidé dans mon cas, donc je l’ai laissé comme jdbc: mysql: // localhost /

Si vous utilisez la mise en veille prolongée, cette erreur peut être causée par le fait de garder un object Session ouvert plus longtemps que wait_timeout

J’ai documenté un cas ici pour ceux qui sont intéressés.

J’ai trouvé la solution

depuis que MySQL a besoin de Localhost pour fonctionner.

allez dans le fichier / etc / network / interfaces et assurez-vous que la configuration de localhost y est définie:

 auto lo iface lo inet loopback 

Maintenant, redémarrez le sous-système de mise en réseau et les services MySQL:

sudo /etc/init.d/networking restart

sudo /etc/init.d/mysql restart

Essayez-le maintenant

Il est principalement dû à une connexion faible entre le client mysql et le serveur mysql distant.

Dans mon cas, c’est à cause d’une connexion VPN instable.

En phpstorm + option de pilote autoReconnect vagrant aidé.

La résolution fournie par Soheil a été un succès dans mon cas.

Pour clarifier, le seul changement que je devais apporter concernait la configuration du serveur MySQL;

 bind-address = **INSERT-IP-HERE** 

J’utilise un serveur MySQL externe pour mon application. C’est une installation de base de Debian 7.5 avec MySQL Server 5.5 – configuration par défaut.

IMPORTANT:

Sauvegardez toujours l’original de tous les fichiers de configuration que vous pouvez modifier. Faites toujours attention lorsque vous êtes élevé en tant que super utilisateur.

Fichier

 /etc/mysql/my.cnf 

Ligne

 bind-address = 192.168.0.103 #127.0.0.1 

Redémarrez votre service serveur MySQL:

 /usr/sbin/service mysql restart 

Comme vous pouvez le voir, j’ai simplement fourni l’adresse IP du serveur et commenté l’entrée par défaut. S’il vous plaît noter que simplement copier et coller ma solution ne fonctionnera pas pour vous, sauf par miracle nos hôtes partagent la même adresse IP.

Merci @ Soheil

Je rencontrais un problème similaire et la solution pour mon cas était

  1. changer l’adresse de liaison = 0.0.0.0 à partir de 127.0.0.1
  2. changer le localhost d’url en localhost: 3306

Ce que j’ai ressenti, c’est que nous ne devrions jamais baisser les arm, j’ai essayé toutes les options de cet article et d’autres forums aussi… heureusement ça marche @saurab

J’ai aussi fait face à ce problème.

Comme Soheil l’a suggéré, je suis allé dans le fichier php.ini sur le chemin C: \ windows \ php.ini, puis j’ai révisé le numéro de port dans ce fichier.

il est sur la ligne mysqli.default_port = ……….

Donc, je l’ai changé dans mon application Java, car il est dans le fichier php.ini, maintenant ça marche bien avec moi.

Je sais que c’est un ancien sujet, mais j’ai essayé de nombreuses choses et résolu mon problème en utilisant les moyens suivants.

Je développe une application multi-plateforme sous Windows, mais qui doit être utilisée sur des serveurs Linux et Windows.

Une firebase database MySQL appelée “jtm” installée sur les deux systèmes. Pour une raison quelconque, dans mon code, j’avais le nom de firebase database “JTM”. Sous Windows, cela a bien fonctionné, en fait sur plusieurs systèmes Windows, il a volé.

Sur Ubuntu, j’ai eu l’erreur au-dessus du temps et du temps. Je l’ai testé avec la casse correcte dans le code “jtm” et cela fonctionne très bien.

Linux est évidemment beaucoup moins tolérant au sujet de la sensibilité à la casse (à juste titre), alors que Windows accorde des indemnités.

Je me sens un peu bête maintenant mais vérifie tout. Le message d’erreur n’est pas le meilleur mais il semble possible de le corriger si vous persévérez et que vous arrivez à faire les choses correctement.

Je viens de redémarrer MySQL (en suivant une astuce ici: https://stackoverflow.com/a/14238800 ) et cela résout le problème.

J’ai eu le même problème sur MacOS (10.10.2) et MySQL (5.6.21) installé via homebrew.

La chose confuse était que l’une de mes applications connectées à la firebase database bien et l’autre pas.

Après avoir essayé beaucoup de choses sur l’application qui a créé l’exception com.mysql.jdbc.CommunicationsException comme suggéré par la réponse acceptée de cette question en vain, j’ai été surpris que le redémarrage de MySQL fonctionne.

La cause de mon problème aurait pu être la suivante, comme suggéré dans la réponse dans le lien susmentionné:

Utilisez-vous un pool de connexions? Si oui, alors essayez de redémarrer le serveur. Probablement peu de connexions dans votre pool de connexions sont en état fermé.

Pour Windows: – Accédez à l’écriture du menu Démarrer, “Assistant de configuration de l’instance MySqlserver” et reconfigurez votre instance de serveur mysql. J’espère que cela résoudra votre problème.

Après des années ayant le même problème et aucune solution permanente, voilà ce qui a été résolu au cours des trois dernières semaines (ce qui est un record en termes de fonctionnement sans erreur)

définir global wait_timeout = 3600;
définir global interactive_timeout = 230400;

N’oubliez pas de rendre ce permanent si cela fonctionne pour vous.

Si vous rencontrez un problème avec un ensemble de conteneurs Docker , assurez-vous de ne pas seulement EXPOSE le port 3306 , mais également de mapper le port depuis l’extérieur du conteneur -p 3306:3306 . Pour docker-compose.yml :

 version: '2' services: mdb: image: mariadb:10.1 ports: - "3306:3306" … 

Si vous utilisez un émulateur local, vous devez utiliser l’adresse IP 10.0.2.2 au lieu de localhost pour accéder à votre serveur MySQL local.