解决 JDBC 和 MySQL 的“通信链路故障”
P粉038161873
P粉038161873 2023-08-24 15:46:59
[MySQL讨论组]

我正在尝试连接到本地 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

我已经设置了类路径,确保 my.cnf 已注释掉跳过网络选项。

java版本是1.2.0_26(64位) mysql 5.5.14 mysql连接器5.1.17

我确保用户有权访问我的数据库。

P粉038161873
P粉038161873

全部回复(1)
P粉068486220

我的两个程序中也遇到了同样的问题。我的错误是这样的:

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.

我花了几天时间才解决这个问题。我测试了不同网站上提到的许多方法,但没有一个有效。最后我更改了代码并找出了问题所在。我将尝试向您介绍不同的方法,并在此处进行总结

当我在互联网上寻找此错误的解决方案时,我发现有许多解决方案至少对一个人有效,但其他人却说这对他们不起作用!

strong> 为什么有很多方法可以解决这个错误? 看起来通常当连接到服务器时出现问题时,就会发生此错误。也许问题是因为错误的查询字符串或与数据库的连接太多。

所以我建议你一一尝试所有的解决方案,不要放弃!

以下是我在互联网上找到的解决方案,对于每个解决方案,至少有一个人的问题已通过该解决方案得到解决。

提示:需要更改MySQL设置的解决方案可以参考以下文件:

  • Linux:/etc/mysql/my.cnf/etc/my.cnf(取决于 Linux 发行版和使用的 MySQL 软件包) p>

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini(注意它是 ProgramData,而不是 Program Files)

以下是解决方案:

  • 更改bind-address属性:

    取消注释 bind-address 属性或将其更改为以下 IP 之一:

    bind-address="127.0.0.1"

    bind-address="0.0.0.0"
  • 注释掉“skip-networking”

    如果 MySQL 配置文件中有 skip-networking 行,请在该行的开头添加 # 符号将其注释。

  • 更改“wait_timeout”和“interactive_timeout”

    将这些行添加到 MySQL 配置文件:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
  • 确保 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。在 Linux 上,这也可以通过运行(或将其放入 /etc/profile 中来实现:

      export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
  • 检查操作系统代理设置、防火墙和防病毒程序

    确保防火墙或防病毒软件没有阻止 MySQL 服务。

    在 Linux 上暂时停止 iptables。如果 iptables 配置错误,它们可能允许 tcp 数据包发送到 mysql 端口,但阻止 tcp 数据包返回同一连接。

    # Redhat enterprise and CentOS
     systemctl stop iptables.service
     # Other linux distros
     service iptables stop

    停止 Windows 上的防病毒软件。

  • 更改连接字符串

    检查您的查询字符串。你的连接字符串应该是这样的:

    dbName = "my_database";
    dbUserName = "root";
    dbPassword = "";
    String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

确保字符串中没有空格。所有连接字符串都应该连续,没有任何空格字符。

尝试将“localhost”替换为环回地址 127.0.0.1。 还尝试将端口号添加到连接字符串中,例如:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

通常 MySQL 的默认端口是 3306。

不要忘记将用户名和密码更改为您的 MySQL 服务器的用户名和密码。

  • 更新您的 JDK 驱动程序库文件
  • 测试不同的 JDK 和 JRE(例如 JDK 6 和 7)
  • 不要更改 max_allowed_pa​​cket

max_allowed_pa​​cket”是MySQL 配置文件中的一个变量,指示最大数据包大小,而不是最大数据包数量。所以这对解决这个错误没有帮助。

  • 更改 tomcat 安全性

将 TOMCAT6_SECURITY=yes 更改为 TOMCAT6_SECURITY=no

  • 使用validationQuery属性

使用validationQuery="select now()"确保每个查询都有响应

  • 自动重新连接

将此代码添加到您的连接字符串中:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

虽然这些解决方案都不适合我,但我建议您尝试一下。因为有些人按照这些步骤解决了他们的问题。

但是什么解决了我的问题呢?

我的问题是我在数据库中有很多 SELECT。每次我创建连接然后关闭它。虽然我每次都关闭连接,但是系统面临很多连接并给了我这个错误。 我所做的是将连接变量定义为整个类的公共(或私有)变量,并在构造函数中初始化它。然后每次我使用该连接时。它解决了我的问题,也极大地提高了我的速度。

#结论# 没有简单且独特的方法来解决这个问题。建议您结合自身情况考虑,选择以上解决方案。如果您在程序开始时出现此错误并且根本无法连接到数据库,则您的连接字符串可能有问题。但是,如果您在与数据库进行多次成功交互后出现此错误,则问题可能出在连接数上,您可能会考虑更改“wait_timeout”和其他 MySQL 设置,或者重写代码以减少连接数。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号