Java 解决a";“通信链路故障”;使用JDBC和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";

我正在尝试连接到本地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.<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,不是程序文件)

以下是解决方案:
  • 更改“绑定地址”属性
取消“绑定地址”属性的注释或将其更改为以下IP之一:

绑定地址=“127.0.0.1”

绑定地址=“0.0.0.0”

  • 注释掉“跳过网络”
如果您的MySQL配置文件中有一行“跳过网络”,请在该行的开头添加“#”符号,使其成为注释

  • 更改“等待超时”和“交互超时”
将以下行添加到MySQL配置文件:

=数量

交互超时=数字

连接超时=数字

  • 确保Java没有将“localhost”转换为[::1]而不是[127.0.0.1]
因为MySQL可以识别127.0.0.1(IPv4),但不能识别:::1(IPv6)

这可以通过使用以下两种方法之一来避免:

选项#1:在连接字符串中使用127.0.0.1而不是localhost,以避免将localhost转换为:::1

选项2:使用-Djava.net.preferIPv4Stack=true选项运行java,强制java使用IPv4而不是IPv6。
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"
        …