Résolution d'un "échec de liaison de communications" avec JDBC et MySQL [dupliquer]

cette question a déjà une réponse ici:

  • com.mysql.jdbc.exception.jdbc4.Exception de communication: défaillance de la liaison de communication 26 réponses

j'essaie de me connecter au serveur MySQL local mais je continue à avoir une erreur.

voici le code.

public class Connect {

    public static void main(String[] args) {
        Connection conn = null;

        try {
            String userName = "myUsername";
            String password = "myPassword";

            String 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.<init>(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.<init>(ConnectionImpl.java:792)
        at com.mysql.jdbc.JDBC4Connection.<init>(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.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:218)
        at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
        ... 15 more

j'ai mis le chemin de classe, je me suis assuré de mon.cnf eu l'ignorer option réseau commenté.

version java est 1.2.0_26 (64 bits) mysql 5.5.14 connecteur mysql 5.1.17

je me suis assuré que l'utilisateur avait accès à ma base de données.

156
demandé sur Tiny 2011-07-29 00:55:24

25 réponses

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 à résoudre ce problème. J'ai testé de nombreuses approches qui ont été mentionnées sur différents sites Web, mais aucune n'a fonctionné. Finalement j'ai changé mon code et j'ai découvert quel était le problème. Je vais essayer de vous parler des différentes approches et les résumer ici .

pendant que je cherchais l'internet pour trouver la solution pour cette erreur, j'ai compris que Il ya beaucoup de solutions qui ont fonctionné pour au moins une personne, mais d'autres disent que cela ne fonctionne pas pour eux! pourquoi y a-t-il plusieurs façons d'aborder cette erreur? Il semble cette erreur peut se produire généralement quand il ya un problème de connexion au serveur . Peut-être que le problème est dû à la mauvaise chaîne de requête ou à trop de connexions la base de données.

Donc, je vous suggère d'essayer toutes les solutions une à une et ne pas abandonner!

Voici les solutions que j'ai trouvées sur internet et pour chacune d'entre elles, il y a au moins sur la personne qui son problème a été résolu avec cette solution.

astuce: pour les solutions dont vous avez besoin pour modifier les paramètres MySQL, vous pouvez vous référer aux fichiers suivants:

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

  • Windows: C:**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Avis c'est ProgramData, pas les Fichiers de Programme)

Voici les solutions:

  • modifier" l'attribut "bind-address

Décommenter "bind-address" attribuez ou changez-le à l'une des IPs suivantes:

bind-address= "127.0.0.1"

ou

bind-address= "0.0.0.0"

  • commentant "skip-networking"

S'il y a une ligne "skip-networking" dans votre fichier de configuration MySQL, faites un commentaire en ajoutant le signe " # " au début de cette ligne.

  • changement "wait_timeout" et "interactive_timeout"

ajouter ces lignes au fichier de configuration MySQL:

wait_timeout = nombre

interactive_timeout = nombre

connect_timeout = nombre

  • assurez-vous que Java n'est-ce pas la traduction de 'localhost' [::: 1] au lieu de [127.0.0.1]

puisque 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 # 1: dans la chaîne de connexion utiliser 127.0.0.1 au lieu de localhost pour éviter que localhost soit traduit en :: 1

Option #2: Run java avec l'option-Djava.net.preferIPv4Stack=true pour forcer java à utiliser IPv4 au lieu D'IPv6. Sur Linux, cela peut aussi être obtenu en exécutant (ou en le plaçant dans /etc/profile:

export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
  • vérifiez les paramètres de proxy du système D'exploitation, les pare-feu et les programmes antivirus

assurez-vous que le pare-feu ou le logiciel antivirus ne bloque pas le service MySQL.

Stop iptables temporairement sous linux. Si iptables est mal configuré, ils peuvent permettre aux paquets tcp d'être envoyés au 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êter le logiciel antivirus sur Windows.

  • modifier 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 = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

assurez-vous que vous n'avez pas d'espaces dans votre chaîne. Toute la chaîne de connexion doit être continue sans aucun caractère d'espace.

essayez de remplacer "localhost" par l'adresse de boucle 127.0.0.1. Essayez aussi d'ajouter le numéro de port à votre chaîne de connexion, comme:

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

habituellement le port par défaut pour MySQL est 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.

  • mise à jour de votre JDK fichier de bibliothèque de pilote
  • tester différents JDK et JREs (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 du paquet, pas le nombre maximum de paquets. Si il ne va pas aider à résoudre cette erreur.

  • changement de tomcat sécurité

change TOMCAT6_SECURITY=yes to TOMCAT6_SECURITY=no

  • utilisation validationQuery propriété

utiliser validationQuery=" select now () "pour s'assurer que chaque requête a des réponses

  • AutoReconnect

ajoutez ce code à votre chaîne de connexion:

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

bien qu'aucune de ces solutions n'ait fonctionné pour moi, je vous suggère de les essayer. Parce qu'il y a des gens qui 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 sélections sur la base de données. Chaque fois, je créais une connexion et je la fermais. Bien que je fermais la connexion à chaque fois, mais le système a fait face à 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 comme une variable publique (ou privée) pour toute la classe et l'ai initialisée dans le constructeur. puis à chaque fois que je viens d'utiliser cette connexion. Il a résolu mon problème et a également augmenté ma vitesse de façon spectaculaire.

Conclusion

il n'y a pas de solution simple et unique à 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 vous n'êtes pas en mesure de se connecter à la base de données, vous pourriez avoir des problèmes dans votre chaîne de connexion. Mais si vous prenez cette erreur après plusieurs interactions réussies dans la base de données, le problème pourrait être avec le nombre de connexions et vous pourriez penser à changer "wait_timeout" et d'autres paramètres MySQL ou réécrivez votre code de façon à réduire le nombre de connexions.

315
répondu Soheil 2017-04-05 16:20:13

si vous utilisez MAMP PRO, la solution facile, que je souhaite vraiment que j'avais réalisé avant de commencer à chercher sur internet pendant des jours en essayant de comprendre cela. C'est vraiment ce simple...

il suffit de cliquer sur" Autoriser L'accès réseau à MySQL " dans l'onglet MAMP MySQL.

vraiment, c'est ça.

Oh, et vous pourriez avoir à changer votre adresse de liaison à 0.0.0.0 ou 127.0.0.1 comme décrit dans les postes ci-dessus, mais si vous êtes un utilisateur MAMP, le simple fait de cliquer sur cette case résoudra probablement vos problèmes.

12
répondu Peter John Joseph 2014-12-30 06:08:17

paramétrer le bind-address sur L'IP Réseau du serveur au lieu de la valeur par défaut localhost, et les privilèges de paramétrage sur mon utilisateur ont fonctionné pour moi.

mon.cnf:

bind-address = 192.168.123.456

MySql Console:

GRANT ALL PRIVILEGES ON dbname.* to username@'%' IDENTIFIED BY 'password';
5
répondu Kevin Lawrence 2013-04-03 21:14:00

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

j'ai eu ce problème aussi. Ma configuration était Mac OSX 10.8, en utilisant une VirtualBox VM gérée par Vagrant D'Ubuntu 12.04, avec MySQL 5.5.34.

j'avais correctement configuré le transfert de port dans le fichier de configuration de Vagrant. Je pourrais envoyer telnet à L'instance MySQL depuis mon Mac et depuis la VM. Donc je savais que le démon MySQL était en marche et accessible. Mais quand j'ai essayé de connecter sur JDBC, j'ai eu l'erreur" défaillance de la liaison de communication".

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

3
répondu devdanke 2014-02-12 02:57:13

dans mon cas, c'était un temps mort, qui a fait tomber la connexion sur le serveur. La connexion a été maintenue ouverte, mais n'a pas été utilisée pendant une longue période. Puis un client redémarre fonctionne, alors que je crois qu'une reconnexion fonctionnera aussi bien.

une bonne solution est d'avoir un démon/service pour ping la connexion de temps en temps.

2
répondu fuoco 2012-09-30 14:46:35

dans mon cas,

  1. modifier la configuration mysql de la machine distante à /etc/mysql/my.cnf : modifier bind-address = 127.0.0.1 de #bind-address = 127.0.0.1

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

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

2
répondu cindyxiaoxiaoli 2014-05-13 19:39:25

pour moi la solution était de changer dans le fichier conf du serveur mysql le paramètre bind-address="127.0.0.1" ou bind-address="X. x.x.x"to bind-address="0.0.0.0". Grâce.

1
répondu jpenaab 2014-07-30 09:53:52

je viens de faire face au même problème. Cela s'est produit parce que le démon MySQL a été relié à L'IP de la machine, ce qui est requis pour faire la connexion avec un utilisateur qui a la permission de se connecter @your_machine. Dans ce cas, L'utilisateur doit avoir la permission de se connecter à USER_NAME@MACHINE_NAME_OR_IP

je voulais un accès à distance à ma machine donc j'ai changé dans mon.cnf de

bind-address = MY_IP_ADDRESS

à

bind-address = 0.0.0.0

qui permettre à un utilisateur de localhost et même de l'extérieur (dans mon cas) de se connecter à l'instance. Les deux permissions ci-dessous fonctionneront si vous liez le MySQL à 0.0.0.0:

USER_NAME@MACHINE_NAME_OR_IP

USER_NAME@localhost
1
répondu Renann 2014-12-11 23:08:21

dans mon cas (je suis un noob), je testais Servlet qui font la connexion de base de données avec MySQL et l'une des exceptions est celle mentionnée ci-dessus.

cela m'a fait tourner la tête pendant quelques secondes mais j'ai réalisé que c'était parce que Je n'ai pas démarré mon serveur MySQL dans localhost .

après le démarrage du serveur, le problème a été corrigé.

So, vérifiez si MySQL server est fonctionnement correct .

1
répondu Barun 2015-09-19 09:54:45

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

0
répondu Bozho 2012-05-27 07:47:06

allez aux services Windows dans le panneau de configuration et démarrez le service MySQL. Pour moi cela a fonctionné. Quand je faisais un projet Java EE j'ai eu cette erreur" Communication link failure". J'ai redémarré mon système et ça a marché.

après cela, j'ai de nouveau eu la même erreur, même après avoir redémarré mon système. Puis j'ai essayé d'ouvrir la console de ligne de commande MySQL et de me connecter avec root, même alors cela m'a donné une erreur.

enfin quand J'ai commencé le MySQL service de Windows services, il a fonctionné.

0
répondu tinku 2013-03-10 09:39:14

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

0
répondu user2180110 2013-03-17 19:24:28

si vous utilisez hibernate, cette erreur peut être causée pour garder ouvert un objet de Session plus de temps que wait_timeout

j'ai documenté un cas dans ici pour ceux qui sont intéressés.

0
répondu Raul Luna 2013-09-03 16:01:16

j'ai trouvé la solution

puisque MySQL a besoin du local pour fonctionner.

aller à /etc/network / interfaces fichier et assurez-vous que vous avez la configuration localhost défini là:

auto lo
iface lo inet loopback

redémarrez maintenant le sous-système de réseau et les services MySQL:

sudo / etc / init.d / networking restart

sudo / etc / init.d / mysql restart

Essayez-le maintenant

0
répondu Mahmoud Zalt 2013-09-13 11:54:07

c'est principalement en raison de la faible connexion entre le client mysql et le serveur mysql distant.

dans mon cas, c'est à cause de la connexion VPN.

0
répondu Ankit Singhal 2013-10-04 18:15:36

in phpstorm + vagrant option pilote autoReconnect helped.

0
répondu gaRex 2014-02-18 05:25:30

la résolution fournie par Soheil a été couronnée de succès dans mon cas.

pour clarifier, le seul changement que je devais faire était avec la configuration du serveur MySQL;

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

j'utilise un serveur MySQL externe pour mon application. Il s'agit d'une installation de base de Debian 7.5 avec la configuration par défaut de MySQL Server 5.5.

IMPORTANT:

toujours sauvegarder l'original de tout fichiers de configuration que vous pouvez modifier. Toujours prendre soin lorsque surélevé comme super utilisateur.

Fichier

/etc/mysql/my.cnf

Ligne

bind-address        = 192.168.0.103 #127.0.0.1

redémarrez votre service de serveur MySQL:

/usr/sbin/service mysql restart

comme vous pouvez le voir, j'ai simplement fourni L'IP Réseau 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, à moins que par certains par miracle, nos hôtes partagent la même IP.

Merci @ Soheil

0
répondu Captain Dusty 2014-05-18 04:46:20

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

  1. changement d'adresse de liaison = 0.0.0 à partir de 127.0.0.1
  2. changement de localhost d'url en localhost: 3306

la chose que j'ai ressentie est nous ne devons jamais abandonner, j'ai essayé toutes les options de ce post et d'autres forums...content que ça fonctionne @saurab

0
répondu Saurab Dulal 2014-07-03 18:20:03

j'ai fait face à ce problème aussi.

comme Soheil l'a suggéré, Je suis allé à php.fichier ini au chemin d'accès C:\windows\php.ini, puis j'ai révisé le numéro de port dans ce fichier.

c'est sur la ligne mysqli.default_port =..........

donc je l'ai changé dans mon application java comme il est dans le php.fichier ini, maintenant ça marche très bien avec moi.

0
répondu PHPFan 2014-12-24 14:06:05

je sais que c'est un vieux fil, mais j'ai essayé de nombreuses choses et corrigé ma question en utilisant les moyens suivants..

je développe une application multiplateformes sur Windows mais à utiliser sur les serveurs Linux et Windows.

une base de données MySQL appelée" jtm " installée sur les deux systèmes. Pour une raison quelconque, dans mon code j'avais le nom de la base de données comme "JTM". Sur les fenêtres il fonctionnait bien, en fait sur plusieurs systèmes de fenêtres il volait le long.

On Ubuntu j'ai eu l'erreur au-dessus de temps en temps encore. Je l'ai testé avec la casse dans le code "jtm" et il fonctionne un régal.

Linux est évidemment beaucoup moins indulgente sur la sensibilité de cas (à juste titre), alors que Windows fait des concessions.

je me sens un peu stupide maintenant mais vérifiez tout. Le message d'erreur n'est pas le meilleur mais il semble réparable si vous persévérez et faites les choses bien.

0
répondu thonnor 2015-01-08 02:05:22

je viens de redémarrer MySQL (suite à un conseil d'ici: https://stackoverflow.com/a/14238800 ) et il a résolu 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és à la base de données amende et l'autre n'a pas.

après avoir essayé beaucoup de choses sur l'application qui a jeté le exception com.mysql.jdbc.CommunicationsException comme l'indique la réponse acceptée à cette question sans résultat, J'ai été surpris que le redémarrage de MySQL ait fonctionné.

La cause de mon problème aurait été le suivant comme il est suggéré dans la réponse dans le lien ci-dessus:

utilisez-vous connexion pool ? Si oui, alors essayez de redémarrer le serveur. Probablement peu de connexions dans votre pool de connexion sont dans l'état fermé.

0
répondu dulon 2017-05-23 11:47:14

Pour Windows :- Aller à l'écriture de menu de démarrage, "MYSQLSERVER Instance Configuration Wizard" et reconfigurer votre instance de serveur mysql. Espérons qu'il permettra de résoudre votre problème.

0
répondu Himanshu Narang 2015-05-15 06:17:41

après des années ayant le même problème et aucune solution permanente c'est ce qui l'a résolu pour les 3 dernières semaines (qui est un record en termes de fonctionnement sans erreur)

set global wait_timeout=3600;

set global interactive_timeout=230400;

n'oubliez pas de rendre cette permanente si elle fonctionne pour vous.

0
répondu itpp13 2015-06-13 12:04:41

dans le cas où vous avez un problème avec un ensemble de conteneurs Docker , alors assurez-vous que vous ne faites pas seulement EXPOSE le port 3306 , mais aussi la carte du port de l'extérieur du conteneur -p 3306:3306 . Pour docker-compose.yml :

version: '2'

services:
    mdb:
        image: mariadb:10.1
        ports:
            - "3306:3306"
        …
0
répondu kaiser 2016-03-23 11:46:38

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.

-3
répondu Carlos 2014-03-07 11:05:10