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.
J'ai passé plusieurs jours à 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é. Finalement, 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 .
Alors que je cherchais sur Internet pour trouver la solution à cette erreur, j'ai compris qu'il existe de nombreuses solutions qui fonctionnent pour au moins une personne, mais d'autres disent que cela ne fonctionne pas pour elles ! pourquoi existe-t-il 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 mauvaise chaîne de requête ou à un trop grand nombre de connexions à la base de données.
Je vous propose 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 une personne à qui son problème a été résolu avec cette solution.
Astuce :Pour les solutions dont vous avez besoin pour modifier les paramètres MySQL, vous pouvez vous référer aux fichiers suivants :
-
Linux :
/etc/mysql/my.cnf
ou/etc/my.cnf
(selon la distribution Linux et le package MySQL utilisé) -
Windows :
C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini
(Remarquez qu'il s'agit de ProgramData, pas de Program Files)
Voici les solutions :
-
changer
bind-address
attribut :Décommentez
bind-address
attribuez-le ou remplacez-le par l'une des adresses IP suivantes :bind-address="127.0.0.1"
ou
bind-address="0.0.0.0"
-
commenter "ignorer le réseautage"
S'il y a un
skip-networking
dans votre fichier de configuration MySQL, faites-le commenter en ajoutant#
signe au début de cette ligne. -
changer "wait_timeout" et "interactive_timeout"
Ajoutez ces lignes au fichier de configuration MySQL :
[wait_timeout][1] = *number* interactive_timeout = *number* connect_timeout = *number*
-
Assurez-vous que Java ne traduit pas 'localhost' en [:::1] au lieu de [127.0.0.1]
Puisque MySQL reconnaît
127.0.0.1
(IPv4
) mais pas:::1
(IPv6
)Cela pourrait être évité en utilisant l'une des deux approches :
-
Dans la chaîne de connexion, utilisez
127.0.0.1
au lieu delocalhost
pour éviterlocalhost
en cours de traduction en:::1
-
Exécutez java avec l'option
-Djava.net.preferIPv4Stack=true
forcer java à utiliserIPv4
au lieu deIPv6
. Sous Linux, cela peut également être réalisé en exécutant (ou en le plaçant dans/etc/profile
:export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
-
-
vérifiez les paramètres de proxy du système d'exploitation, les pare-feu et les programmes antivirus
Assurez-vous que le pare-feu ou le logiciel antivirus ne bloque pas le service MySQL.
Arrêtez temporairement iptables sous Linux. Si iptables est mal configuré, il peut autoriser l'envoi de paquets tcp au port mysql, mais empêcher les paquets tcp de revenir sur la même connexion.
# Redhat enterprise and CentOS systemctl stop iptables.service # Other linux distros service iptables stop
Arrêtez le logiciel antivirus sous Windows.
-
modifier 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 qu'il n'y a pas d'espaces dans votre chaîne. Toute la chaîne de connexion doit être continue sans aucun espace.
Essayez de remplacer "localhost" par l'adresse de bouclage 127.0.0.1. Essayez également d'ajouter le 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";
Habituellement, le port par défaut pour MySQL est 3306.
N'oubliez pas de remplacer le nom d'utilisateur et le mot de passe par le nom d'utilisateur et le 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 modifiez pas max_allowed_packet
"max_allowed_packet " est une variable dans le fichier de configuration MySQL qui indique la taille maximale des paquets, et non le nombre maximal de paquets. Cela n'aidera donc pas à résoudre cette erreur.
- modifier 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 beaucoup de SELECT sur la base de données. À chaque fois, je créais une connexion, puis je la fermais. Bien que je fermais la connexion à chaque fois, le système était confronté à 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 que je l'ai initialisée dans le constructeur. Ensuite, à chaque fois, j'ai utilisé cette connexion. Cela a résolu mon problème et a également augmenté ma vitesse de manière spectaculaire.
#Conclusion#Il n'y a pas de 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 rencontrez cette erreur au début du programme et que vous ne parvenez pas du tout à vous connecter à la base de données, vous pourriez avoir un problème dans votre chaîne de connexion. Mais si vous rencontrez cette erreur après plusieurs interactions réussies avec la base de données, le problème peut être lié au nombre de connexions et vous pouvez envisager de modifier "wait_timeout" et d'autres paramètres MySQL ou de réécrire votre code pour réduire le nombre de connexions.