43 votes

MySQL-JDBC: échec de la liaison de communication

Mon programme qui se connecte à une base de données MySQL fonctionnait bien. Puis, sans changer le code utilisé pour configurer la connexion, j'obtiens cette exception:

 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.
 

Qu'est-il arrivé?

Le code utilisé pour obtenir la connexion:

 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;
}
 

37voto

BalusC Points 498232

C'est un enveloppé exception, et pas vraiment intéressant. Il est la cause de l'exception qui, en fait, nous dit quelque chose à propos de la cause racine. S'il vous plaît regardez un peu plus loin dans la stacktrace. La chance est grande que vous serez alors face à un SQLException: Connection refused ou SQLException: Connection timed out.

Si cela est vrai dans votre cas, alors toutes les causes possibles sont:

  1. Adresse IP ou nom d'hôte dans l'URL JDBC est faux.
  2. Nom d'hôte dans l'URL JDBC n'est pas reconnu par le serveur DNS local.
  3. Numéro de Port est manquant ou erroné dans l'URL JDBC.
  4. DB serveur est en panne.
  5. DB serveur n'accepte pas les connexions TCP/IP.
  6. Quelque chose entre Java et DB bloque les connexions, par exemple, un pare-feu ou un proxy.

Pour résoudre l'un ou l'une ou l'autre, suivez les conseils suivants:

  1. De les vérifier et de les tester avec ping.
  2. Actualisation de DNS ou de l'utilisation de l'adresse IP dans l'URL JDBC à la place.
  3. Vérifier sur la base my.cnf de la DB MySQL.
  4. Le démarrer.
  5. Vérifier si mysqld est démarré sans le --skip-networking option.
  6. Désactiver le pare-feu et/ou de configurer le pare-feu/proxy pour permettre/port.

Par la voie (et sans lien avec le réel problème), vous n'avez pas nécessairement besoin de charger le pilote JDBC sur toutes les getConnection() appel. Juste une seule fois pendant le démarrage est assez.

12voto

sujit sathe Points 71

vérifiez votre délai d'attente défini sur le serveur de base de données. Parfois, la valeur par défaut est 10 secondes. Cela perd la connexion en 10 secondes.

 mysql> show global variables like '%time%' ;
 

mettre à jour le faire quelque chose comme 28800

 mysql> SET GLOBAL wait_timeout = 28800;
 

4voto

J'ai eu ce problème aussi pour environ 8 à 9 jours. Voici le contexte: je suis l'élaboration d'une simple application Java qui s'exécute dans bash.

Détails:

  • Printemps 2.5.6
  • Hibernate3.2.3.ga
  • Avec maven. (La base du projet est de mkyong.com le printemps tutoriel sans anotations )
  • Version de MySQL:
[jvazquez@archbox ~]$ mysql --version
mysql Ver 14.14 Distrib 5.5.9, pour Linux (i686) à l'aide de readline 5.1
Linux archbox 2.6.37-ARC #1 SMP PREEMPT Fri Feb 18 16:58:42 UTC 2011 i686 Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33 GHz GenuineIntel GNU/Linux

L'application fonctionne très bien dans les Arch Linux, Mac OS X 10.6, et FreeBSD 7.2. Quand j'ai déplacé le fichier jar à l'autre arch linux dans un autre hôte, en utilisant les mêmes mysql, un semblable, mon.cnf, et de la version du noyau, le lien est mort et a obtenu la même erreur que l'original de l'affiche:

com.mysql.jdbc.des exceptions.jdbc4.CommunicationsException: Défaillance du lien

J'ai essayé toutes les combinaisons possibles pour ce que j'ai trouvé sur donc et les forums (http://forums.mysql.com/read.php?39,180347,180347#msg-180347 par exemple, qui est maintenant fermé et je ne peux pas poster .. ), en particulier:

  • Triple vérifier que je n'étais pas à l'aide de sauter la mise en réseau. (vérifié avec le ps aux et la mon.cnf)
  • Essayé d'activer log_warnings=1 dans le mon.cnf, mais évidemment, je n'ai pas de frapper la serveur donc je n'ai pas vu quoi que ce soit alors à l'aide de l'application
  • MONTRER le MOTEUR innodb STATUS à ne pas montrer quoi que ce soit; au cours des tests, j'ai pu connecter via le shell, et php connecté au serveur mysql
  • /etc/hosts a localhost 127.0.0.1
  • Essayé de jdbc propriétés à l'aide de localhost et 127.0.0.1 sans résultats
  • Essayé d'ajouter c3p0 et changé le max_wait
  • Max connexions dans le mon.cnf a été changé à 900 , 2000 et toujours rien mon.cnf
  • Ajouté wait_timeout = 60 ma.cnf
  • Ajouté net_wait_timeout = 360 ma.cnf
  • Ajouté le destroy-method="fermer" spring.xml

Comme il a été souligné (si vous regardez pour la même exception , vous trouverez plusieurs threads sur la question de Reproduire com.mysql.jdbc.des exceptions.jdbc4.CommunicationsException avec un programme d'installation de Spring, hibernate et C3P0 pour exemple ).

  1. Si vous utilisez tomcat, veuillez vérifier l'exception de sécurité (encore une fois, c'est sur, DONC, vous le trouverez )
  2. Vérifiez que vous pouvez résoudre l'adresse url que vous utilisez
  3. Essayez d'ajouter c3p0.
  4. Vérifier qu'il n'y a pas un pare-feu rejet de vos connexions
  5. Enfin , si vous utilisez GNU/Linux ( ARch linux par exemple et vous en effet d'obtenir cette exception ) Essayez MySQL Forums :: JDBC et Java :: EOFException: ne Peut pas lire la réponse du serveur. Lire 4 octets, lire 0 octets avant la connexion a été inopinément perdu

Si le lien est supprimé, il suffit d'ajouter mysqld:TOUS à /etc/hosts.permettre

Je sais que c'est un peu grande, mais il peut aider toute personne à l'aide de GNU/Linux et le fait que cette exception et ce fil semble être le meilleur endroit pour poster ma recherche.

J'espère que ça aide

3voto

MBCook Points 8316

Nous avons un morceau de logiciel (webapp avec Tomcat) à l'aide d'Apache commons regroupement de connexion, et a très bien fonctionné pendant des années. Dans le dernier mois, j'ai eu à mettre à jour les bibliothèques en raison d'un vieux bug, nous accablaient. Le bug avait été corrigé dans une version récente.

Peu de temps après le déploiement de ce, nous avons commencé à obtenir exactement ces messages. Sur les milliers de connexions, nous aurions un jour, une poignée (moins de 10 ans, en général) serait d'obtenir ce message d'erreur. Il n'y a pas de motif réel, sauf qu'ils seraient parfois cluster en petits groupes de 2 à 5.

J'ai changé les options de la piscine pour valider la connexion à chaque fois qu'on est pris à partir ou à remettre dans la piscine (si on le trouve mauvais, un nouveau est généré à la place) et le problème a disparu.

Avez-vous mis à jour votre MySQL pot dernièrement? Il semble que il peut y avoir un nouveau paramètre qui n'a pas l'habitude d'être là dans notre (certes très vieux) bocal.

Je suis d'accord avec BalusC essayer d'autres options sur votre config, tels que ceux que vous êtes de passage à MySQL (en plus du délai d'attente de connexion).

Si cet échec est transitoire comme le mien a été, au lieu de la constante, alors vous pouvez utiliser un simple try/catch et une boucle pour continuer à essayer jusqu'à ce que les choses réussir ou d'utiliser un pool de connexions à gérer que les détails pour vous.

D'autres aléatoire idée: je ne sais pas ce qui se passe pourquoi vous essayez d'utiliser une connexion fermée (qui d'exception que vous obtenez). Pourriez-vous être accidentellement la fermeture de la connexion quelque part?

3voto

StressedEric Points 516

Assurez-vous que skip-networking est commenté dans my.cnf / my.ini

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X