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;
}
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:
Pour résoudre l'un ou l'autre, suivez les conseils suivants:
ping
.my.cnf
de la base de données MySQL.--skip-networking
.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.
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;
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
J'espère que cela aidera.
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:
[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:
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 ).
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
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?
Assurez-vous que skip-networking est commenté dans my.cnf/my.ini
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).
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.
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".
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!
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.
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!! :)
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.
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.
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.