web-dev-qa-db-fra.com

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

J'ai installé une installation de base de mysql 5.5, et bien que je puisse me connecter au service mysql via la commande mysql, et que le service semble fonctionner, 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 lance:

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.

17
Stefan Kendall

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, il s'agit probablement de 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 à distance à mysql (également sur Ubuntu 8.04).

18
Boden

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 les résumer ici .

Pendant que je cherchais Internet pour trouver la solution à cette erreur, j'ai compris qu'il existe de nombreuses solutions qui fonctionnaient 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 cette erreur peut se produire en général en cas de problème de connexion au serveur . Le problème est peut-être dû à une chaîne de requête incorrecte ou à trop 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 = numéro

interactive_timeout = numéro

connect_timeout = numéro

  • vérifiez 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'espace 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.

  • mettez à jour votre fichier de bibliothèque de pilotes JDK
  • testez différents JDK et JRE (comme JDK 6 et 7)
  • ne change 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

  • utilisez 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 plusieurs 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.

13
Soheil

Cela peut également être causé par une erreur paramètres proxy. 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 puisque j'étais derrière un proxy SOCKS, je devais définir l'hôte MySql comme hôte non proxy (par exemple, sur un Mac, vous pouvez configurer cela dans Paramètres -> Réseau -> Avancé -> Proxy, et enfin ajoutez le nom d'hôte ou l'adresse IP dans les "Paramètres de proxy de contournement pour ces hôtes et domaines").

1
Simone Bruno

MySQL Connector/J ne prend en charge que 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.

1
Sankar.lp.gym

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.

1
Stephen Thompson

Il y a aussi cet énorme bogue dans la version 5.1.9 du pilote mysql-jdbc:

http://bugs.mysql.com/bug.php?id=47494

1
Mathieu

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.

0
user56399

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ée ici , comme vous pouvez le voir, je lance Ubuntu, j'espère que cela fonctionne.

0
comanitza

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();
    }
0
ozgun bayrak