Maison > Questions et réponses > le corps du texte
P粉7318612412023-08-29 00:12:12
J'ai également rencontré le même problème dans deux programmes. Mon erreur est 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.
Il m'a fallu quelques jours pour résoudre ce problème. J'ai testé de nombreuses méthodes mentionnées sur différents sites Web mais aucune n'a fonctionné. Finalement, j'ai changé le code et compris le problème. Je vais essayer de vous présenter différentes méthodes et de les les résumer ici.
Lorsque je cherchais des solutions à cette erreur sur Internet, j'ai trouvé Il y avait de nombreuses solutions qui fonctionnaient pour au moins une personne, mais d'autres ont dit que cela ne fonctionnait pas pour elles !
strong> Pourquoi existe-t-il de nombreuses façons de corriger cette erreur ? Il semble généralement cette erreur se produit lorsqu'il y a un problème de connexion au serveur. Le problème est peut-être dû à une chaîne de requête incorrecte 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 !
Vous trouverez ci-dessous les solutions que j'ai trouvées sur Internet. Pour chaque solution, le problème d'au moins une personne a été résolu par cette solution.
Conseils : Pour les solutions nécessitant de modifier les paramètres MySQL, veuillez vous référer aux documents suivants :
Linux : /etc/mysql/my.cnf
或 /etc/my.cnf
(dépend de la distribution Linux et du package MySQL utilisé) p>
Windows : C:**ProgramData**MySQLMySQL Server 5.6my.ini
(notez qu'il s'agit de ProgramData, pas de Program Files)
Changer bind-address
Propriétés :
Décommentez l'attribut bind-address
ou remplacez-le par l'une des adresses IP suivantes :
bind-address="127.0.0.1"
ou
bind-address="0.0.0.0"
Commentez "skip-networking"
S'il y a un symbole skip-networking
行,请在该行的开头添加 #
dans le fichier de configuration MySQL, commentez-le.
Changez "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" par [:::1] au lieu de [127.0.0.1]
Parce que MySQL peut reconnaître 127.0.0.1
(IPv4
),但不能识别 :::1
(IPv6
)< /p>
Cela peut être évité en utilisant l'une des deux méthodes suivantes :
Utilisez 127.0.0.1
而不是 localhost
以避免 localhost
被转换为 ::: 1
Utilisez l'option -Djava.net.preferIPv4Stack=true
运行java以强制java使用IPv4
而不是IPv6
。在 Linux 上,这也可以通过运行(或将其放入 /etc/profile
pour réaliser :
export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
Vérifiez les paramètres proxy du système d'exploitation, les programmes pare-feu et antivirus
Assurez-vous que le service MySQL n'est pas bloqué par un pare-feu ou un logiciel antivirus.
Arrêtez temporairement iptables sous Linux. Si iptables est mal configuré, ils peuvent autoriser l'envoi de paquets TCP vers le port MySQL, mais empêcher les paquets TCP de revenir à 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.
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 qu'il n'y a pas d'espaces dans la chaîne. Toutes les chaînes de connexion doivent être contiguës 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 à la 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 ceux de votre serveur MySQL.
"max_allowed_packet" est une variable du fichier de configuration MySQL qui indique la taille maximale des paquets, et non le nombre maximum de paquets. Cela n'aide donc pas à résoudre cette erreur.
Remplacez TOMCAT6_SECURITY=yes par TOMCAT6_SECURITY=no
Utilisez validationQuery="select now()" pour garantir une réponse à chaque requête
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 recommande de les essayer. Parce que certaines personnes ont résolu leurs problèmes en suivant ces étapes.
Mais qu'est-ce qui a résolu mon problème ?
Mon problème est que j'ai beaucoup de SELECT dans la base de données. Chaque fois que je crée une connexion, puis je la ferme. Bien que je ferme la connexion à chaque fois, le système fait face à de nombreuses connexions et me renvoie cette erreur. Ce que j'ai fait, c'est définir la variable de connexion comme variable publique (ou privée) pour toute la classe et l'initialiser dans le constructeur. Ensuite, à chaque fois que j'utilise cette connexion. Cela a résolu mon problème et amélioré considérablement ma vitesse.
#conclusion# Il n’existe pas de moyen simple et unique de résoudre ce problème. Il est recommandé d'envisager les solutions ci-dessus en fonction de votre propre situation. Si vous obtenez cette erreur au début de votre programme et que vous ne parvenez pas du tout à vous connecter à la base de données, il se peut qu'il y ait un problème avec votre chaîne de connexion. Cependant, si vous obtenez cette erreur après de nombreuses interactions réussies avec la base de données, le problème peut provenir du nombre de connexions et vous pouvez envisager de modifier « wait_timeout » et d'autres paramètres MySQL, ou de réécrire le code pour réduire le nombre de connexions.