web-dev-qa-db-fra.com

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: é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;
}
42
Nick Heiner

C'est une exception encapsulée et pas vraiment intéressante. C'est la cause racine de l'exception qui nous dit quelque chose à propos de la cause racine. S'il vous plaît regarder un peu plus loin dans la pile. La chance est grande que vous fassiez ensuite face à un SQLException: Connection refused ou un SQLException: Connection timed out.

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

  1. L'adresse IP ou le nom d'hôte dans l'URL JDBC est incorrect.
  2. Le nom d'hôte dans l'URL JDBC n'est pas reconnu par le serveur DNS local.
  3. Le numéro de port est manquant ou incorrect dans l'URL JDBC.
  4. Le serveur de base de données est en panne.
  5. Le serveur de base de données n'accepte pas les connexions TCP/IP.
  6. Quelque chose entre Java et la base de données bloque les connexions, par exemple. un pare-feu ou un proxy.

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

  1. Vérifiez et testez-les avec ping.
  2. Actualisez le DNS ou utilisez plutôt l'adresse IP dans l'URL JDBC.
  3. Vérifiez-le sur my.cnf de la base de données MySQL.
  4. Commencez le.
  5. Vérifiez si mysqld est démarré sans l'option --skip-networking.
  6. Désactivez le pare-feu et/ou configurez pare-feu/proxy pour autoriser/transférer le port.

Soit dit en passant (et sans lien avec le problème réel), vous n'avez pas nécessairement besoin de charger le pilote JDBC lors de chaque appel getConnection(). Une seule fois au démarrage suffit.

37
BalusC

vérifiez le délai d'attente défini sur le serveur de base de données . Il est parfois défini par défaut sur 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;
11
sujit sathe

J'ai eu la même erreur Mais ensuite je l'ai compris parce que le serveur Mysql ne fonctionne pas à ce moment-là.

Donc, pour changer le statut du serveur

  1. Aller au gestionnaire de tâches
  2. Aller aux services
  3. puis recherchez votre serveur Mysql (par exemple: pour mon cas sa MYSQL56)
  4. alors vous verrez dans la colonne de statut, il dit que sa ne fonctionne pas
  5. par un clic droit et sélectionnez Démarrer

J'espère que cela aidera.

5
Rahal Kanishka

Je rencontre également ce problème depuis environ 8 à 9 jours . Voici un aperçu: je développe une application Java simple qui s'exécute en bash.

Détails:

  • Printemps 2.5.6
  • Hibernate3.2.3.ga
  • Avec maven . (La base du projet provient de mkyong.com, le tutoriel de printemps sans annotations)
  • Version de MySQL:
[jvazquez @ archbox ~] $ mysql --version 
 mysql Ver 14.14 Distrib 5.5.9, pour Linux (i686) en utilisant readline 5.1 
 Linux archbox 2.6.37-Arch # 1 SMP AVANT PREMIÈRE Vendredi 18 février 16:58 : 42 UTC 2011 i686 Q8200 à quatre processeurs Intel Core (TM) 2 à 2,33 GHz Genuine Intel GNU/Linux

L'application fonctionne correctement sous Arch Linux, Mac OS X 10.6 et FreeBSD 7.2 . Lorsque j'ai déplacé le fichier jar vers un autre Arch Linux dans un hôte différent, en utilisant le même mysql, un my.cnf similaire et un noyau similaire. version, la connexion est morte et a obtenu la même erreur que l’affiche originale:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Échec de la liaison de communication

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

  • Vérifiez trois fois que je n'utilisais pas le réseau. (vérifié avec ps aux et le my.cnf)
  • J'ai essayé d'activer log_warnings = 1 dans le fichier my.cnf mais, de toute évidence, je ne frappais pas le serveur ; Je n'ai donc rien vu lors de l'utilisation de l'application.
  • SHOW ENGINE innodb STATUS n'a rien montré du tout. lors des tests, j'ai pu me connecter via Shell et php également connecté au serveur mysql 
  • / etc/hosts a l'hôte local 127.0.0.1
  • Essayé les propriétés jdbc en utilisant localhost et 127.0.0.1 sans résultats
  • J'ai essayé d'ajouter c3p0 et j'ai changé le max_wait 
  • Le nombre maximal de connexions dans le fichier my.cnf a été remplacé par 900, 2000 et toujours rien mon.cnf
  • Wait_timeout = 60 my.cnf ajouté
  • Ajout de net_wait_timeout = 360 my.cnf
  • Ajout de la méthode destroy = "close" spring.xml

Comme il a été souligné (si vous recherchez la même exception, vous trouverez plusieurs discussions sur le problème Reproduce com.mysql.jdbc.exceptions.jdbc4.CommunicationsException avec une configuration de Spring, hibernate et C3P0 par exemple ).

  1. Si vous utilisez Tomcat, veuillez vérifier l’exception de sécurité (encore une fois, c’est sur SO, vous la trouverez)
  2. Vérifiez que vous pouvez résoudre cette URL que vous utilisez
  3. Essayez d'ajouter c3p0.
  4. Vérifiez qu'il n'y a pas de pare-feu rejetant vos connexions
  5. Enfin, si vous utilisez GNU/Linux (Arch Linux par exemple et que vous obtenez bien cette exception) Try Forums MySQL :: JDBC et Java :: EOFException: Impossible de lire la réponse du serveur. Devrait lire 4 octets, lire 0 octet avant que la connexion ne soit perdue de manière inattendue

Si le lien est supprimé, ajoutez simplement mysqld: ALL à /etc/hosts.allow

Je sais que c'est un peu long, mais cela pourrait aider n'importe qui utilisant GNU/Linux et ayant cette exception et ce fil semblait le meilleur endroit pour poster mes recherches.

J'espère que ça aide

4
Jorge Omar Vazquez

Nous avons un logiciel (application Web avec Tomcat) qui utilise le pooling de connexions Apache, et a bien fonctionné pendant des années. Le mois dernier, j'ai dû mettre à jour les bibliothèques à cause d'un ancien bug que nous rencontrions. Le bogue avait été corrigé dans une version récente.

Peu de temps après le déploiement, nous avons commencé à recevoir exactement ces messages. Sur les milliers de connexions que nous aurions une journée, une poignée (généralement moins de 10) recevrait ce message d'erreur. Il n’y avait pas de tendance réelle, sauf qu’ils se regroupaient parfois en petits groupes de 2 à 5.

J'ai modifié les options sur sur le pool pour valider la connexion à chaque fois qu'une connexion est extraite ou remise dans le pool (si l'une d'entre elles est trouvée mauvaise, une nouvelle est générée à la place) et le problème a disparu.

Avez-vous mis à jour votre jarre MySQL récemment? Il semble qu'il y ait peut-être un nouveau paramètre qui n'existait pas auparavant dans notre bocal (certes très vieux).

Je suis d’accord avec BalusC pour essayer d’autres options de votre configuration, telles que celles que vous passez à MySQL (en plus du délai de connexion).

Si cet échec est transitoire, comme le mien, au lieu d’être permanent, vous pouvez utiliser un simple essai/intercepter et une boucle pour continuer d’essayer jusqu’à ce que tout se passe bien ou utiliser un pool de connexions pour gérer ce détail pour vous.

Autre idée aléatoire: je ne sais pas ce qui se passe pourquoi vous essayez d'utiliser une connexion fermée (quelle exception vous obtenez). Pourriez-vous fermer accidentellement la connexion quelque part?

3
MBCook

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

3
PorridgeBear

Comme BalusC l’a mentionné, il serait très utile de poster le complet stacktrace (toujours poster un stacktrace complet, il est inutile et frustrant de n’avoir que les premières lignes d’un stacktrace). 

Quoi qu'il en soit, vous avez indiqué que votre code fonctionnait bien et que ce problème a soudainement commencé à se produire sans aucune modification du code. Je me demande donc si cela pourrait être lié à vous. Problème lié à l'absence de fermeture de la connexion à la base de données pendant le débogage? En fait, si ce problème a commencé pendant le débogage, alors je pense que c'est le cas (vous avez manqué de connexions). Dans ce cas, redémarrez votre serveur de base de données (et suivez les suggestions de l'autre question pour éviter cette situation).

2
Pascal Thivent

J'ai rencontré le même problème. J'utilise spring & dbcp & mysql 5.5But Si je change localhost en 192.168.1.110, alors tout fonctionnera. Ce qui rend les choses plus étranges, c'est que mysql -h localhost fonctionne bien.

mise à jour: Enfin trouvé une solution. Remplacer bindaddress par localhost ou 127.0.0.1 dans my.conf résoudra le problème. 

1
LiuJian

Dans mon cas, l'interface de bouclage local n'a pas été démarrée, donc "localhost" n'a pas pu être résolu . Vous pouvez le vérifier en exécutant "ifconfig" et vous devriez voir une interface appelée "lo". Si ce n'est pas le cas, vous pouvez l'activer en exécutant "ifup lo" ou "ifconfig lo up".

0
Alexander Bering

Le problème principal est que les connexions au pool Mysql JDBC ne sont pas utilisées. Dans ce cas, le timeout de Mysql ferme les connexions. Vous devez modifier les paramètres du pool pour obtenir une connexion de redémarrage lorsque la connexion a échoué, de cette manière:

Connection Validation: Obligatoire (cocher)
Validation Method: autocommit

Vous pouvez modifier la méthode de validation si vous ne pouvez pas l'obtenir fonctionne!

0

J'ai eu l'erreur d'échec de la communication lors de l'utilisation de Java.sql.PreparedStatement avec une instruction spécifique. 

Cela fonctionnait sous MySQL 5.6, Tomcat 7.0.29 et JDK 1.7.0_67 sur un ordinateur Windows 7 x64. 

La cause s'est avérée définir un entier pour un paramètre de chaîne et une chaîne pour un paramètre d'entier, puis une tentative d'exécution de executeQuery sur l'instruction préparée. Après avoir corrigé l’ordre de paramétrage, l’instruction s’effectue correctement.

Cela n’a rien à voir avec des problèmes de réseau, comme le suggère le libellé du message d’erreur.

0
Will Marsh

Je vois que vous vous connectez à un hôte distant. Maintenant, la question est quel type de réseau utilisez-vous pour vous connecter à Internet? 

LES FENÊTRES

S'il s'agit d'un périphérique haut débit mobile, vous devez alors obtenir l'adresse IP de votre ordinateur et l'ajouter à votre serveur d'hébergement afin que votre serveur hôte puisse autoriser les connexions provenant de votre ordinateur. ] . Notez que chaque fois que vous utilisez un périphérique réseau différent, votre adresse IP change.

Si vous utilisez un réseau local, définissez une adresse IP statique sur votre ordinateur, puis ajoutez-la à votre hôte. 

J'espère que ça aide!! :)

0
21stking

Dans mon cas, le fichier mysql.com téléchargé Connector/J 5.1.29 .jar avait cette erreur alors que le fichier 5.1.29 .jar téléchargé à partir du référentiel MvnRepository ne.

Cela s'est produit lors de la création d'une application Google Appengine dans Android Studio (gradle, Windows x64), qui communiquait avec un serveur Linux MySQL sur le réseau local/la machine virtuelle.

0
mstrthealias

J'ai eu le même problème et j'ai utilisé la plupart des paramètres (connexion automatique, etc.), mais je n'ai pas essayé le (test_on_idle ou test_on_connect), je vais les faire ensuite.

Cependant, j'ai eu ce bidouillage qui m'a permis de traverser ceci: 

J'ai une tâche cron appelée Healthcheck. Elle se réveille toutes les 10 minutes et effectue un appel d'API REST au serveur. Le serveur Web/application le détecte, se connecte à la base de données, effectue une petite modification et revient avec un 'oui, tout est calme sur le front occidental' ou 'shitshappening'. Lorsque ce dernier envoie un pager/email aux bonnes personnes.

Cela a pour effet secondaire de toujours conserver le pool de connexions à la base de données fraîche. Tant que ce cron est en cours d'exécution, les problèmes de délai de connexion à la base de données ne me concernent pas. sinon, ils surgissent.

0
Sree

Si vous utilisez WAMP, assurez-vous qu'il est en ligne. Ce que j’ai fait, c’est d’abord éteint mon pare-feu, puis cela a fonctionné. Après cela, j’ai permis la connexion pour tous les ports locaux, spécialement le port 80. Je me suis débarrassé de ce problème. Pour moi, c'était le pare-feu qui bloquait la connexion.

0
Dilukshan Mahendra