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

我确保用户可以访问我的数据库。

1115490 次浏览

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

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,而不是Program Files)

以下是解决方案:

  • 改变bind-address属性:

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

     bind-address="127.0.0.1"
    

     bind-address="0.0.0.0"
    
  • < p > 注释掉“跳网”;

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

  • < p > 改变“wait_timeout"和“;interactive_timeout"

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

    [wait_timeout][1] = *number*
    
    
    interactive_timeout = *number*
    
    
    connect_timeout = *number*
    
  • < p > 确保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"
      
  • < p > 检查操作系统代理设置、防火墙和防病毒程序

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

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

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

    关闭Windows杀毒软件。

  • < p > 更改连接字符串

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

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

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

Try to replace "使用环回地址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和JREs(如JDK 6和7)
  • 不要改变max_allowed_packet

max_allowed_packet"是MySQL配置文件中的一个变量,表示最大数据包大小,而不是最大数据包数。所以它对解决这个错误没有帮助。

  • 更改tomcat安全性

将TOMCAT6_SECURITY=yes修改为TOMCAT6_SECURITY=no

  • 使用validationQuery属性

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

  • AutoReconnect

将以下代码添加到连接字符串中:

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

虽然这些方法对我都不起作用,但我建议你试一试。因为有些人按照这些步骤解决了他们的问题。

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

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

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

在我的例子中,当MySQL没有足够的内存时就会发生这种情况。重新启动可以修复它,但如果是这种情况,请考虑使用内存更大的机器,或者限制jvm占用的内存

在我的例子中,这是一个空闲超时,导致连接在服务器上断开。连接保持打开状态,但长时间没有使用。然后客户端重新启动工作,而我相信重新连接也会工作。

一个不错的解决方案是使用一个守护进程/服务来不时地ping连接。

进入控制面板的“Windows服务”,启动MySQL服务。对我来说,这很有效。当我在做一个Java EE项目时,我得到了这个错误“通信链路故障”。我重启了我的系统,然后它就工作了。

之后,我再次得到相同的错误,即使重新启动我的系统。然后我尝试打开MySQL命令行控制台并以root登录,即使这样它也给了我一个错误。

最后,当我从Windows服务启动MySQL服务时,它工作了。

有相同的。 删除端口对我的情况有帮助,所以我把它保留为jdbc:mysql://localhost/

bind-address设置为服务器的网络IP而不是本地主机默认值,并在我的用户上设置特权对我来说是有效的。

my.cnf:

bind-address = 192.168.123.456

MySql控制台:

GRANT ALL PRIVILEGES ON dbname.* to username@'%' IDENTIFIED BY 'password';

如果您正在使用hibernate,此错误可能导致保持打开Session对象的时间超过wait_timeout

我在在这里中为感兴趣的人记录了一个案例。

我找到了解决办法

因为MySQL需要Localhost才能工作。

转到/etc/network/interfaces文件,并确保在那里设置了本地主机配置:

auto lo
iface lo inet loopback

现在重启网络子系统和MySQL服务:

sudo /etc/init.d /网络重启

sudo /etc/init.d / mysql重启

现在试试吧

这主要是因为mysql客户端和远程mysql服务器之间的连接很弱。

在我的情况下,这是因为不稳定的VPN连接。

正如上面的详细回答所说,这个错误可能是由许多事情引起的。

我也有这个问题。我的设置是Mac OSX 10.8,使用Vagrant管理的VirtualBox虚拟机,Ubuntu 12.04, MySQL 5.5.34。

我已经在Vagrant配置文件中正确地设置了端口转发。我可以从我的Mac和VM中远程登录到MySQL实例。因此,我知道MySQL守护进程正在运行并且可以访问。但是当我试图通过JDBC连接时,我得到了“通信链路失败”错误。

在我的例子中,通过编辑/etc/mysql/my.cnf文件解决了这个问题。具体来说,我注释掉了“#bind-address=127.0.0.1”行。

在phpstorm + vagrant autoReconnect驱动程序选项帮助。

如果您正在使用本地模拟器,您必须使用IP地址10.0.2.2而不是localhost来访问本地MySQL服务器。

我也遇到过同样的问题。 发生这种情况是因为MySQL守护进程绑定到机器的IP,这是与有权限连接@your_machine的用户建立连接所必需的。 在这种情况下,用户应该有权限连接USER_NAME@MACHINE_NAME_OR_IP

我想要远程访问我的机器,所以我把my.cnf从

bind-address = MY_IP_ADDRESS

bind-address = 0.0.0.0
这将允许来自localhost和甚至外部(在我的情况下)的用户连接到实例。 如果你将MySQL绑定为0.0.0.0,下面两种权限都可以工作:

USER_NAME@MACHINE_NAME_OR_IP


USER_NAME@localhost

就我而言,

  1. 修改远程机器mysql配置/etc/mysql/my.cnf: Change bind-address = 127.0.0.1 来 李#bind-address = 127.0.0.1 < / p > < / >

  2. 在远程机器上修改mysql用户权限为 李GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password'; < / p > < / >

  3. 重要:在远程机器上重新启动mysql: sudo /etc/init.d/mysql restart

在我的案例中,Soheil提供的解决方案是成功的。

澄清一下,我唯一需要做的改变是MySQL的服务器配置;

bind-address = **INSERT-IP-HERE**

我正在为我的应用程序使用一个外部MySQL服务器。它是一个基本的Debian 7.5安装MySQL服务器5.5 -默认配置。

重要的是:

始终备份您可能修改的任何配置文件的原始文件。当被提升为超级用户时一定要小心。

文件

/etc/mysql/my.cnf

bind-address        = 192.168.0.103 #127.0.0.1

重新启动MySQL服务器:

/usr/sbin/service mysql restart

如您所见,我只是提供了服务器的网络IP,并注释掉了默认条目。请注意,简单地复制和粘贴我的解决方案不会为您工作,除非奇迹我们的主机共享相同的IP。

谢谢@ Soheil

我也遇到过类似的问题,我的解决方案是

  1. 改变bind-address = 0.0.0.0从127.0.0.1
  2. 更改url的localhost为localhost:3306

我觉得我们永远不应该放弃,我尝试了这篇文章和其他论坛上的所有选择…很高兴它能起作用@saurab

对我来说,解决方案是在mysql服务器的conf文件中修改参数bind-address="127.0.0.1"或bind-address=" x.x.x.x "。to bind-address="0.0.0.0"。 谢谢。< / p >

我也遇到过这个问题。

正如Soheil所说, 我去了php.ini文件的路径C:\windows\php.ini,然后我修改了这个文件中的端口号。< / p >

它在mysqli.default_port =..........这一行

所以我在我的java应用程序中更改了它,因为它在php.ini文件中,现在它与我一起工作很好。

如果你使用的是MAMP PRO,那么很容易就能解决这个问题,我真希望在我开始在互联网上搜索几天试图解决这个问题之前就已经意识到这一点。真的很简单…

你只需要从MAMP MySQL选项卡中点击“允许网络访问MySQL”。

真的,就是这样。

哦,你可能仍然需要将绑定地址更改为0.0.0.0或127.0.0.1,就像上面文章中概述的那样,但是如果你是一个MAMP用户,只单击这个框就可能解决你的问题。

我知道这是一个老线程,但我已经尝试了许多事情,并使用以下方式解决了我的问题。

我正在Windows上开发一个跨平台应用程序,但要在Linux和Windows服务器上使用。

一个名为“jtm”的MySQL数据库安装在两个系统上。出于某种原因,在我的代码中,我将数据库名称设置为“JTM”。在Windows系统上运行得很好,事实上在几个Windows系统上都运行得很好。

在Ubuntu上,我一次又一次地得到上面的错误。我在代码“jtm”中用正确的情况进行了测试,它工作得很好。

Linux显然对大小写敏感不那么宽容(这是正确的),而Windows则允许。

我现在觉得有点傻,但检查一切。错误信息并不是最好的,但如果你坚持并把事情做好,它似乎是可以修复的。

我只是重新启动MySQL(遵循这里的提示:https://stackoverflow.com/a/14238800),它解决了这个问题。

我在通过homebrew安装的MacOS(10.10.2)和MySql(5.6.21)上也有同样的问题。

令人困惑的是,我的一个应用程序可以连接到数据库,而另一个则不能。

在应用程序上尝试了许多东西,抛出了com.mysql.jdbc.CommunicationsException异常,这是这个问题的公认答案所建议的,但没有效果,我很惊讶重新启动MySQL工作了。

我的问题的原因可能如下所示,在上述链接的回答:

你正在使用连接池?如果是,请尝试重新启动 服务器。

.连接池中可能只有少数连接处于关闭状态

Windows:- 进入开始菜单,写“MySqlserver实例配置向导”,重新配置你的mysql服务器实例。 希望它能解决你的问题。

多年来一直有同样的问题,没有永久的解决方案,这是过去3周解决的问题(这是一个无错误操作的记录)

set global wait_timeout=3600 设置全局interactive_timeout=230400

如果这对你有用,别忘了把它变成永久性的。

在我的情况下(我是一个新手),我正在测试Servlet,使数据库与MySQL连接,其中一个异常是上面提到的。

它使我的头摆动了几秒钟,但我开始意识到这是因为我没有在localhost中启动我的MySQL服务器
启动服务器后,问题得到了解决。

所以,检查MySQL服务器是否运行正常

如果你对一组码头工人的容器有问题,那么确保你不仅EXPOSE端口3306,而且从容器-p 3306:3306外部映射端口。docker-compose.yml:

version: '2'


services:
mdb:
image: mariadb:10.1
ports:
- "3306:3306"
…