Mysql
 sql >> Base de données >  >> RDS >> Mysql

Résoudre une panne de lien de communication avec JDBC et MySQL

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 :

    1. Dans la chaîne de connexion, utilisez 127.0.0.1 au lieu de localhost pour éviter localhost en cours de traduction en :::1

    2. Exécutez java avec l'option -Djava.net.preferIPv4Stack=true forcer java à utiliser IPv4 au lieu de IPv6 . 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.