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.
Je passe quelques jours pour 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é. Enfin, j'ai changé mon code et découvert quel était le problème. Je vais essayer de vous parler des différentes approches et de les résumer ici .
Alors que je cherchais Internet pour trouver la solution à cette erreur, j'ai compris qu'il existe de nombreuses solutions qui ont fonctionné pour au moins une personne, mais d'autres disent que cela ne fonctionne pas pour elles! pourquoi il existe 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 chaîne de requête incorrecte ou à un trop grand nombre de connexions à la base de données.
Je vous suggère 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 sur personne qui son problème a été résolu avec cette solution.
point: Pour les solutions dont vous avez besoin pour modifier les paramètres MySQL, vous pouvez vous référer à ce qui suit pas:
Voici les solutions:
- modification de l'attribut "bind-address"
Décommentez l'attribut "bind-address" ou remplacez-le par l'un des Ips suivants:
bind-address = "127.0.0.1"
ou
bind-address = "0.0.0.0"
- commentant "skip-networking"
S'il y a une ligne "skip-networking" dans votre fichier de configuration MySQL, faites-la commenter en ajoutant le signe "#" au début de cette ligne.
- changer "wait_timeout" et "interactive_timeout"
Ajoutez ces lignes au fichier de configuration MySQL:
wait_timeout = nombre
interactive_timeout = nombre
connect_timeout = nombre
- vérifier les paramètres du proxy du système d'exploitation
Assurez-vous que le pare-feu ou les logiciels antivirus ne bloquent pas le service MySQL.
- 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 que vous n'avez pas d'espaces dans votre chaîne. Toute la chaîne de connexion doit être continue sans aucun espace.
Essayez de remplacer "localhost" par votre port, comme 127.0.0.1. Essayez également d'ajouter un 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";
Le port par défaut pour MySQL est généralement 3306.
N'oubliez pas de changer le nom d'utilisateur et le mot de passe en nom d'utilisateur et 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 changez pas max_allowed_packet
" max_allowed_packet " est une variable du fichier de configuration MySQL qui indique la taille maximale des paquets, pas le nombre maximal de paquets. Il ne sera donc pas utile de résoudre cette erreur.
- changer 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
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 de nombreux SELECT sur la base de données. Chaque fois, j'ai créé une connexion, puis je l'ai fermée. Bien que j'ai fermé la connexion à chaque fois, mais le système a fait face à 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 l'initialisé dans le constructeur. Ensuite, chaque fois que je viens d'utiliser cette connexion. Cela a résolu mon problème et a également considérablement augmenté ma vitesse.
Conclusion
Il n'existe aucun 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 prenez cette erreur au début du programme et que vous ne parvenez pas du tout à vous connecter à la base de données, vous pouvez avoir un problème dans votre chaîne de connexion. Mais si vous prenez cette erreur après plusieurs interactions réussies avec la base de données, le problème pourrait être avec le nombre de connexions et vous pourriez penser à changer "wait_timeout" et d'autres paramètres MySQL ou réécrire votre code afin de réduire le nombre de connexions.