recherche

Maison  >  Questions et réponses  >  le corps du texte

Résoudre les problèmes de « défaillance du lien de communication » à l'aide de JDBC et MySQL

<p>我正在尝试连接到本地 MySQL 服务器,但不断收到错误消息。</p> <p>这是代码。</p> <pre class="brush:php;toolbar:false;">public class Connect { public static void main(String[] args) { Connection conn = null; try { String userName = "myUsername"; String password = "myPassword"; String url = "jdbc:mysql://localhost:3306/myDatabaseName"; Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, userName, password); System.out.println("Database connection established"); } catch (Exception e) { System.err.println("Cannot connect to database server"); System.err.println(e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); System.out.println("Database Connection Terminated"); } catch (Exception e) {} } } } }</pre> <p>以及错误:</p> <pre class="brush:php;toolbar:false;">Cannot connect to database server 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. 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. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at Connect.main(Connect.java:16) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at java.net.Socket.connect(Socket.java:478) at java.net.Socket.<init>(Socket.java:375) at java.net.Socket.<init>(Socket.java:218) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 15 more</pre> <p>我已经设置了类路径,确保 my.cnf 已注释掉跳过网络选项。 </p> <p>java版本是1.2.0_26(64位) mysql 5.5.14 mysql连接器5.1.17</p> <p>我确保用户有权访问我的数据库。</p>
P粉633309801P粉633309801452 Il y a quelques jours463

répondre à tous(1)je répondrai

  • P粉731861241

    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é)

    • Windows : C:**ProgramData**MySQLMySQL Server 5.6my.ini (notez qu'il s'agit de ProgramData, pas de Program Files)

    Voici la solution :

    • Changer bind-addressProprié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 :

      1. Utilisez 127.0.0.1 而不是 localhost 以避免 localhost 被转换为 ::: 1

        dans la chaîne de connexion
      2. 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.

    • Mettez à jour les fichiers de votre bibliothèque de pilotes JDK
    • Testez différents JDK et JRE (par exemple JDK 6 et 7)
    • Ne modifiez pas max_allowed_packet

    "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.

    • Changer la sécurité de Tomcat

    Remplacez TOMCAT6_SECURITY=yes par TOMCAT6_SECURITY=no

    • Utiliser l'attribut validationQuery

    Utilisez validationQuery="select now()" pour garantir une réponse à chaque requête

    • 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 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.

    répondre
    0
  • Annulerrépondre