Impossible de se connecter à mysql via le connecteur JDBC via Tomcat ou en externe

17

J'ai installé une installation mysql 5.5 standard, et bien que je puisse me connecter au service mysql via la commande mysql, et que le service semble être en cours d'exécution, je ne peux pas me connecter via spring + tomcat ou depuis un connecteur jdbc externe.

J'utilise l'URL suivante:

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

avec un nom d'utilisateur / mot de passe correct, mais je reçois le message suivant:

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.

et tomcat jette:

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)

Ce qui semble être le même problème que si j'essaie de me connecter en externe.

Stefan Kendall
la source
J'ai rencontré ce problème lors de la tentative de connexion via java à ma base de données mysql qui s'exécute sur un autre serveur de mon réseau local. lors de l'exécution du même programme java sur le serveur qui exécute mysql, il se connectait sans problème. à partir de la machine externe, je pouvais me connecter à la base de données mysql en utilisant SQLYog par exemple (bien que j'ai d'abord dû changer le fichier my.cnf pour le lier à 0.0.0.0 au lieu de 127.0.0.1). La réponse de Boden et le commentaire sur le changement du connecteur JDBC m'ont indiqué dans la bonne direction. J'ai changé le connecteur JDBC à la dernière version et tout à coup ça a fonctionné!
user2380870

Réponses:

18

Cela peut se produire pour diverses raisons. Je l'ai vu moi-même il y a quelques semaines, mais je ne me souviens pas de la solution pour moi.

1) Vérifiez que mysql est lié à l'adresse, c'est probablement 127.0.0.1 (uniquement) qui, je crois, est la valeur par défaut (au moins sur le serveur Ubuntu standard). Vous devrez commenter le paramètre bind-address dans my.cnf pour vous lier à toutes les adresses disponibles (vous ne pouvez pas en choisir plusieurs, c'est une ou toutes).

2) S'il est lié à 127.0.0.1 et que vous ne pouvez pas vous connecter à l'aide de "localhost", assurez-vous qu'il ne se résout pas à l'adresse IPv6 localhost au lieu d'IPv4. (ou utilisez simplement l'adresse IP)

3) Vérifiez et revérifiez le port sur lequel mysql écoute.

4) Assurez-vous que vous utilisez le bon connecteur JDBC pour votre JDK.

5) Assurez-vous que vous ne faites pas quelque chose de vraiment idiot comme démarrer mysql avec --skip-networking.

Je pense que ma première suggestion est la plus prometteuse ... en fait, je pense que c'est là que je l'ai vue récemment ... J'essayais de me connecter à mysql à distance (également sur Ubuntu 8.04).

Boden
la source
Juste pour ajouter mon 2 cent, le 4 a fonctionné pour moi. Merci!
Janis Peisenieks
1
concernant "Vous devrez commenter le paramètre bind-address dans my.cnf pour lier à toutes les adresses disponibles", la valeur par défaut est maintenant d'écouter uniquement sur localhost, vous devrez donc peut-être utiliser la ligne "bind-address = 0.0. 0.0 "dans [mysqld].
Palo
13

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.

Je passe quelques jours pour résoudre ce problème. J'ai testé de nombreuses approches qui ont été mentionnées dans différents sites Web, mais aucune d'entre elles n'a fonctionné. Enfin, j'ai changé mon code et découvert quel était le problème. Je vais essayer de vous parler des différentes approches et de les résumer ici .

Alors que je cherchais Internet pour trouver la solution à cette erreur, j'ai compris qu'il existe de nombreuses solutions qui ont fonctionné pour au moins une personne, mais d'autres disent que cela ne fonctionne pas pour elles! pourquoi il existe de nombreuses 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 base de données.

Je vous suggère donc d'essayer toutes les solutions une par une et de ne pas abandonner!

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

point: Pour les solutions dont vous avez besoin pour modifier les paramètres MySQL, vous pouvez vous référer à ce qui suit pas:

  • Linux: /etc/my.cnf

  • Windows: D: \ Program Files \ mysql \ bin \ my.ini

Voici les solutions:

  • modification de l'attribut "bind-address"

Décommentez l'attribut "bind-address" ou remplacez-le par l'un des Ips suivants:

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-la commenter 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

  • vérifier les paramètres du proxy du système d'exploitation

Assurez-vous que le pare-feu ou les logiciels antivirus ne bloquent pas le service MySQL.

  • changer la chaîne de connexion

Vérifiez votre chaîne de requête. votre chaîne de connexion devrait ressembler à 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 espace.

Essayez de remplacer "localhost" par votre port, comme 127.0.0.1. Essayez également d'ajouter un 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";

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 en nom d'utilisateur et 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 du fichier de configuration MySQL qui indique la taille maximale des paquets, pas le nombre maximal de paquets. Il ne sera donc pas utile de résoudre cette erreur.

  • changer la sécurité de Tomcat

changer TOMCAT6_SECURITY = oui en TOMCAT6_SECURITY = non

  • 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 qu'aucune de ces solutions n'ait 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 de nombreux SELECT sur la base de données. Chaque fois, j'ai créé une connexion, puis je l'ai fermée. Bien que j'ai fermé 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'initialisé dans le constructeur. Ensuite, chaque fois que je viens d'utiliser cette connexion. Cela a résolu mon problème et a également considérablement augmenté ma vitesse.

Conclusion

Il n'existe aucun moyen simple et unique de 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 du tout à vous connecter à la base de données, vous pouvez avoir un problème dans votre chaîne de connexion. Mais si vous prenez cette erreur après plusieurs interactions réussies avec 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éécrire votre code afin de réduire le nombre de connexions.

Soheil
la source
J'avais aussi ce problème! Mais j'avais initialement changé mysql pour écouter le port 8888 au lieu de 3306. Donc, la réponse de @ sohail a aidé, je viens d'ajouter le port 8888 à mon uri et cela a fonctionné! Merci beaucoup
Cela a résolu le problème pour moi! Avec notre configuration Vagrant Homestead, il était lié pour une raison quelconque à l'adresse donnée à la machine virtuelle (10.0.2.15 dans mon cas) au lieu de localhost.
Lander
1

Si vous exécutez une installation Linux, lokkit bloque probablement les communications entrantes, sauf via SSH.

Connectez-vous en tant que root et exécutez la commande lokkit à partir de l'invite, désactivez le pare-feu et SElinux et voyez si vous avez le même problème.

Vérifiez également que vos autorisations ont été définies correctement, afin que tout puisse écrire aux bons emplacements.

Stephen Thompson
la source
J'utilise Ubuntu 8.04. J'aurais probablement dû le mentionner. Avez-vous des instructions spécifiques pour cette distribution? Je vais google dans un instant, mais j'ai pensé que je demanderais d'abord.
Stefan Kendall,
sudo ufw disable désactivera le pare
Stephen Thompson
J'ai installé ufw et essayé d'activer le port, mais pas de dés.
Stefan Kendall,
ufw et iptables étaient déjà désinstallés. Je pensais que ufw était un outil de gestion qui devait être installé séparément. Effectivement, "iptables" ne produit aucune commande de ce type et aucun service iptables ne semble fonctionner.
Stefan Kendall,
Ok enfin la chose que j'ai souvent trouvée est que vous n'activez pas mysql pour écouter sur l'interface eth0, et souvent ce n'est que sur l'interface localhost. Essayez ce qui suit. Remplacez jdbc: mysql: //myserver.com: myport / mydb par jdbc: mysql: // localhost: myport / mydb si cela fonctionne, vous devez procéder comme suit dev.mysql.com/doc/refman/5.1/en/ can-not-connect-to-server.html
Stephen Thompson
1

Cela peut également être dû à des paramètres de proxy incorrects . J'ai eu ce problème en essayant de me connecter via jdbc à une instance MySQL fonctionnant dans une appliance virtuelle Parallels sur mon Mac. La connexion jdbc utilise les paramètres réseau au niveau du système et comme j'étais derrière un proxy SOCKS, j'ai dû définir l'hôte MySql comme hôte non proxy (par exemple, sur un Mac, vous pouvez le configurer dans Paramètres-> Réseau-> Avancé- > Proxy, puis ajoutez le nom d'hôte ou l'adresse IP dans les "Paramètres de proxy de contournement pour ces hôtes et domaines").

Simone Bruno
la source
1

MySQL Connector / J prend uniquement en charge TCP / IP Java ne prend pas en charge la connectivité des sockets de domaine Unix

Si MYSQL est démarré avec l'indicateur de mise en réseau ou si MySQL s'exécute derrière le pare-feu, l'option TCP / IP est désactivée. Pour que Java ne puisse pas communiquer avec MySQL.

Sankar.lp.gym
la source
0

j'ai eu un problème très similaire pendant presque une journée, et ça m'a rendu fou! mais j'ai réussi à trouver la solution, et c'était très, très simple, il suffit de /etc/init.d/tomcat6 pour changer TOMCAT6_SECURITY = yes en TOMCAT6_SECURITY = no. ce n'est pas ma solution, je l'ai trouvé ici , comme vous pouvez le voir, je lance Ubuntu, j'espère que cela fonctionne.


la source
0

J'ai eu le même problème. Modification de la propriété "bind-address" dans le fichier /etc/mysql/my.cnf à 0.0.0.0, et cela fonctionne. La ligne correspondante dans my.cnf ressemble à ceci:

bind-address = 0.0.0.0

Avant qu'il ne soit défini sur l'adresse IP extérieure du serveur, il ressemblait donc à quelque chose comme:

bind-address = 196.152.4.145

Je pense que lorsqu'il est défini sur l'adresse IP extérieure et non sur la boucle localhost, le serveur mysql est simplement connecté à la carte réseau et n'écoute pas les connexions de la boucle locale.


la source
0

essayez votre adresse locale pour lier l'adresse dans le fichier my.cnf

Connexion 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
la source