Java 解决a";“通信链路故障”;使用JDBC和MySQL
我正在尝试连接到本地MySQL服务器,但我一直收到一个错误 这是代码Java 解决a";“通信链路故障”;使用JDBC和MySQL,java,mysql,jdbc,Java,Mysql,Jdbc,我正在尝试连接到本地MySQL服务器,但我一直收到一个错误 这是代码 public class Connect { public static void main(String[] args) { Connection conn = null; try { String userName = "myUsername"; String password = "myPassword";
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.<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
无法连接到数据库服务器
通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:411)
位于com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
位于com.mysql.jdbc.MysqlIO(MysqlIO.java:344)
位于com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333)
位于com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370)
位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154)
位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:792)
位于com.mysql.jdbc.JDBC4Connection(JDBC4Connection.java:47)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:411)
位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
位于java.sql.DriverManager.getConnection(DriverManager.java:582)
位于java.sql.DriverManager.getConnection(DriverManager.java:185)
在Connect.main(Connect.java:16)
原因:java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
位于java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
位于java.net.socksocketimpl.connect(socksocketimpl.java:366)
位于java.net.Socket.connect(Socket.java:529)
位于java.net.Socket.connect(Socket.java:478)
位于java.net.Socket(Socket.java:375)
位于java.net.Socket(Socket.java:218)
位于com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
在com.mysql.jdbc.MysqlIO上(MysqlIO.java:294)
... 还有15个
我已经设置了类路径,确保my.cnf已注释掉跳过网络选项
java版本为1.2.0_26(64位)
mysql 5.5.14
mysql连接器5.1.17
我确保用户可以访问我的数据库。我的两个程序也遇到了同样的问题。我的错误是:
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.
我花了几天时间来解决这个问题。我已经测试了许多在不同网站上提到的方法,但没有一种有效。最后我修改了代码,找出了问题所在。我将尝试告诉您不同的方法,并在这里对它们进行总结
当我在互联网上寻找这个错误的解决方案时,我发现有很多解决方案至少对一个人有效,但其他人说对他们无效为什么有很多方法可以解决此错误?
似乎当连接到服务器出现问题时,通常会发生此错误。问题可能是因为错误的查询字符串或到数据库的连接太多
所以我建议你一个接一个地尝试所有的解决方案,不要放弃
以下是我在互联网上找到的解决方案,对于每一个,至少有一个人的问题已经用这个解决方案解决了
提示:对于需要更改MySQL设置的解决方案,可以参考以下文件:
- Linux:/etc/mysql/my.cnf或/etc/my.cnf(取决于使用的Linux发行版和mysql包)
- Windows:C:**ProgramData**\MySQL\MySQL Server 5.6\my.ini(注意它是ProgramData,不是程序文件)
- 更改“绑定地址”属性
- 注释掉“跳过网络”
- 更改“等待超时”和“交互超时”
- 确保Java没有将“localhost”转换为[::1]而不是[127.0.0.1]
export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
# Redhat enterprise and CentOS
systemctl stop iptables.service
# Other linux distros
service iptables stop
dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
bind-address = 192.168.123.456
GRANT ALL PRIVILEGES ON dbname.* to username@'%' IDENTIFIED BY 'password';
auto lo
iface lo inet loopback
bind-address = MY_IP_ADDRESS
bind-address = 0.0.0.0
USER_NAME@MACHINE_NAME_OR_IP
USER_NAME@localhost
bind-address = **INSERT-IP-HERE**
/etc/mysql/my.cnf
bind-address = 192.168.0.103 #127.0.0.1
/usr/sbin/service mysql restart
version: '2'
services:
mdb:
image: mariadb:10.1
ports:
- "3306:3306"
…