问答中心分类: MYSQL使用 JDBC 和 MySQL 解决“通信链路故障”[重复]
0
匿名用户 提问 12分钟 前

这个问题在这里已经有了答案:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
(50 个回答)

关闭6年前.

我正在尝试连接到本地 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
我确保用户可以访问我的数据库。

Jim Garrison 回复 12分钟 前

注意底部的 CausedBy。 SQL 服务器从不接受连接。如果做(从命令行)会发生什么telnet localhost 3306? mySQL 服务器是否正在运行?

Jim Garrison 回复 12分钟 前

检查这篇文章。可能有帮助:stackoverflow.com/questions/15949/…

Jim Garrison 回复 12分钟 前

问题已解决,在 my.cnf 中添加了一个绑定地址条目。

Jim Garrison 回复 12分钟 前

你为你的绑定地址设置了什么地址?

Jim Garrison 回复 12分钟 前

@Anthony您应该将您的评论作为答案并接受它…

Jim Garrison 回复 12分钟 前

我尝试在控制面板中转到 Windows 服务并启动 mysql 服务,然后它工作了..试试这个解决方案

Jim Garrison 回复 12分钟 前

我遇到了同样的问题。我更改了对我有用的端口号。它会使用像我这样的人。

Jim Garrison 回复 12分钟 前

在我的情况下,查询过于复杂并导致 MySQL ‘挂起’——即使是从外部 Java 代码执行时也是如此。我假设连接只是在查询完成时断开。

Jim Garrison 回复 12分钟 前

禁用 Windows 防火墙对我有用。

Jim Garrison 回复 12分钟 前

bind-address = 192.168.0.3 #这是您的本地系统IP地址,针对特定IP地址运行命令->将dbname.*上的所有权限授予dbusername@’192.168.0.3′ IDENTIFIED BY ‘dbpassword’;对所有 IP 地址运行命令-> 将 dbname.* 上的所有权限授予 dbusername@’%’ IDENTIFIED BY ‘dbpassword’;

Jim Garrison 回复 12分钟 前

youtu.be/ray3YvnIohM

24 Answers
0
Soheil 回答 12分钟 前

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

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 包)
  • 视窗: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 配置文件中的行,通过添加使其注释#在该行的开头签名。
  • 更改“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. 使用选项运行 java-Djava.net.preferIPv4Stack=true强制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=”select now()” 确保每个查询都有响应

  • 自动重新连接

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

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

尽管这些解决方案都不适合我,但我建议您尝试一下。因为有些人按照这些步骤解决了他们的问题。
但是什么解决了我的问题?
我的问题是我在数据库上有很多 SELECT。每次我创建一个连接然后关闭它。虽然我每次都关闭连接,但系统面临许多连接并给了我这个错误。我所做的是将我的连接变量定义为整个类的公共(或私有)变量,并在构造函数中对其进行初始化。然后每次我只使用那个连接。它解决了我的问题,也大大提高了我的速度。
#结论#没有简单而独特的方法来解决这个问题。我建议您考虑自己的情况并选择上述解决方案。如果您在程序开始时遇到此错误并且您根本无法连接到数据库,则您的连接字符串可能有问题。但是,如果在与数据库的几次成功交互后出现此错误,则问题可能出在连接数上,您可能会考虑更改“wait_timeout”和其他 MySQL 设置或重写代码以减少连接数。

Siddharth 回复 12分钟 前

我只添加了wait_timeout,参考dev.mysql.com/doc/refman/5.1/en/…

Charles Wood 回复 12分钟 前

变量在哪里TOMCAT6_SECURITYvalidationQuery?谢谢!

Prakash K 回复 12分钟 前

这里的这个链接似乎也很有用:supermanhamuerto.com/…

smonff 回复 12分钟 前

@soheil没有简单而独特的方法来解决这个问题。当然,但无论如何,你让我很开心。我爱你。

Tom Lime 回复 12分钟 前

经验法则——如果你写了一个代码,即使它以前工作过也不能很好地工作——首先要寻找问题是代码或者最近变化的对象(比如 – 更新了 mysql 配置)。单例是解决您问题的正确模式。强烈推荐阅读本书“Head First Design Patterns”以了解更多信息。

Srinath Ganesh 回复 12分钟 前

@Soheil 在哪里添加 validationQuery=”…” 。你的意思是 DBCP 还是 C3P0 ?或者没有它可以完成吗

Sainan 回复 12分钟 前

@Soheil您没有提到我遇到的问题:我只是忘记允许端口通过服务器上的防火墙,但是您帮助了我,因为您说我必须检查我是否有客户端防火墙。

Basil Musa 回复 12分钟 前

@Soheil你能添加“暂时禁用iptables”吗,这是我的问题。 iptables 配置错误,允许将 tcp 数据包发送到 mysql 端口,但阻止 tcp 数据包从同一连接返回。

thorinkor 回复 12分钟 前

@Soheil 感谢您的解决方案-对我来说,更改 MySQL 配置中的 wait_timeout 参数就可以了!初始值仅设置为“300”!

Malus Jan 回复 12分钟 前

我也有这个问题。当我将 JAVA 与本地 mysql 一起使用时,没有任何问题。当我将 PHP 与远程 mysql 服务器的数据库一起使用时,也没有任何问题。但是当我将 JAVA 与远程 mysql 服务器一起使用时,它显示了确切的错误。

Markus Barthlen 回复 12分钟 前

使用正确的事务管理器后,事情真的很快。谢谢。

linqu 回复 12分钟 前

对于您的问题,连接池会解决它

Marco 回复 12分钟 前

我不在本地主机中使用mysql。我的问题是绑定地址配置。感谢您的支持和经验。

Kaleb 回复 12分钟 前

我该去哪里更改这些配置?有没有办法通过工作台做到这一点

Freeman 回复 12分钟 前

对我来说,它正在添加useSSL=false&allowPublicKeyRetrieval=true在 URL 的末尾jdbc:mysql://localhost:3306/cloudapp?useSSL=false&allowPublicKeyRetrieval=true

MrG 回复 12分钟 前

绑定地址是我的问题……

craastad 回复 12分钟 前

如果您有 IP 地址白名单来连接到您的数据库,当您没有将当前 IP 列入白名单时,这将是错误消息。

blearyeye 回复 12分钟 前

就我而言,数据适配器的类路径有错误。

Yossi Schwartz 回复 12分钟 前

在这里没有看到这种情况,但我能够解决使用连接超时=<value>范围。 (值应该 > 0)。我的 jdbc 连接字符串适用于负载均衡模式,因此我希望即使 1 个连接因网络故障而关闭,系统也能正常工作。随着连接超时默认=0(无超时),连接挂起,客户端无法启动。例子:jdbc:mysql://localhost:3306/my_database?useUnicode=yes&characterEncoding=UTF-8&connectTimeout=5

Muhammad Ali 回复 12分钟 前

我在驱动器 C 中没有看到任何程序文件夹,为什么?

0
P.J. 回答 12分钟 前

如果您使用的是 MAMP PRO,这是一个简单的解决方法,我真的希望在我开始搜索互联网几天试图解决这个问题之前就已经意识到这一点。真的就是这么简单……
您只需从 MAMP MySQL 选项卡中单击“允许网络访问 MySQL”。
真的,就是这样。
哦,您可能仍必须将绑定地址更改为 0.0.0.0 或 127.0.0.1,如上面帖子中所述,但如果您是 MAMP 用户,单独单击该框可能会解决您的问题。

Shantanu 回复 12分钟 前

这样做为我节省了很多时间。当我知道这只是一个单一的解决方案时,我能感觉到自己达到了沸点。

Strainy 回复 12分钟 前

对我来说,这些端口与 MAMP 在起始页上所说的完全不同。进入 MAMP 首选项并检查端口选项卡以查看您的实际 MySQL 端口是什么。

kimbaudi 回复 12分钟 前

我的应用程序可以在 Windows 和 Ubuntu 上运行,但不能在装有 MAMP PRO 的 Mac 上运行。这也是我让我的应用程序在 Mac 上运行的方式。

0
Kevin Lawrence 回答 12分钟 前

设置bind-address到服务器的网络 IP 而不是 localhost 默认值,并且为我的用户设置权限对我有用。
我的.cnf:

bind-address = 192.168.123.456

MySql 控制台:

GRANT ALL PRIVILEGES ON dbname.* to username@'%' IDENTIFIED BY 'password';
Eric Kramer 回复 12分钟 前

或者对所有接口使用 0.0.0.0 …

alex 回复 11分钟 前

答案对我有用,你能描述一下吗@'%'意思是在上面的mysql指令中?

Daddy32 回复 11分钟 前

bind-address = 0.0.0.0 为我工作。

0
cindyxiaoxiaoli 回答 11分钟 前

就我而言,

  1. 在以下位置更改远程机器 mysql 配置/etc/mysql/my.cnf: 改变bind-address = 127.0.0.1#bind-address = 127.0.0.1
  2. 在远程机器上,更改 mysql 用户权限GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
  3. 重要提示:在远程机器上重新启动 mysql:sudo /etc/init.d/mysql restart
Luis Crespo 回复 11分钟 前

在 Ubuntu/Debian 中安装 MySQL 后,安装过程是安全的,默认情况下会阻止任何外部访问。为了从任何远程机器访问 MySQL,总是需要这些步骤。

0
Renann 回答 11分钟 前

我刚刚遇到了同样的问题。发生这种情况是因为 MySQL 守护程序绑定到机器的 IP,这是与有权连接 @your_machine 的用户建立连接所必需的。在这种情况下,用户应该有权连接 USER_NAME@MACHINE_NAME_OR_IP
我想远程访问我的机器,所以我在 my.cnf 中从

bind-address = MY_IP_ADDRESS

bind-address = 0.0.0.0

这将允许来自本地主机甚至外部(在我的情况下)的用户连接到实例。如果将 MySQL 绑定到 0.0.0.0,则以下两个权限都将起作用:

USER_NAME@MACHINE_NAME_OR_IP

USER_NAME@localhost