我正在尝试连接到本地 MySQL 服务器,但不断收到错误消息。
这是代码。
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) {} } } } }
以及错误:
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.(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. (ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection. (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. (Socket.java:375) at java.net.Socket. (Socket.java:218) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257) at com.mysql.jdbc.MysqlIO. (MysqlIO.java:294) ... 15 more
我已经设置了类路径,确保 my.cnf 已注释掉跳过网络选项。
java版本是1.2.0_26(64位) mysql 5.5.14 mysql连接器5.1.17
我确保用户有权访问我的数据库。
J'ai également rencontré le même problème dans deux programmes. Mon erreur est la suivante :
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 lesles 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 produitlorsqu'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)Voici la solution :
Changer
bind-address
Propriétés :Décommentez l'attribut
bind-address
ou remplacez-le par l'une des adresses IP suivantes :ou
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 :
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
)Cela peut être évité en utilisant l'une des deux méthodes suivantes :
Utilisez
dans la chaîne de connexion127.0.0.1
而不是localhost
以避免localhost
被转换为::: 1
Utilisez l'option
-Djava.net.preferIPv4Stack=true
运行java以强制java使用IPv4
而不是IPv6
。在 Linux 上,这也可以通过运行(或将其放入/etc/profile
pour réaliser :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.
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 :
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 :
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 :
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.