用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 

我已经设置了类path,确保my.cnf有跳过networking选项注释掉。

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. 

我花了好几天的时间来解决这个问题。 我testing了很多在不同网站上提到过的方法,但是其中没有一个能够工作。 最后,我改变了我的代码,发现了什么问题。 我会试着告诉你不同的方法, 并在这里总结一下

当我在寻找互联网寻找解决这个错误的方法时,我发现有很多解决scheme至less对一个人有用,但是有些人却说这个解决scheme对他们来说不起作用! 为什么这个错误有很多方法? 看起来这个错误通常发生在连接到服务器时出现问题 。 也许问题是由于错误的查询string或太多的连接到数据库。

所以我build议你一个一个尝试所有的解决scheme,不要放弃!

以下是我在互联网上find的解决scheme,对于他们每个人来说,至less有一个人是用他的解决scheme解决了他的问题。

提示:对于需要更改MySQL设置的解决scheme,可以参考以下文件:

  • Linux:/etc/mysql/my.cnf或/etc/my.cnf(取决于所使用的Linux发行版和MySQL包)

  • Windows:C:**程序数据** \ MySQL \ MySQL服务器5.6 \ my.ini(注意它是程序数据,而不是程序文件)

以下是解决scheme:

  • 改变“绑定地址”属性

取消注释“绑定地址”属性或将其更改为以下IP之一:

绑定地址=“127.0.0.1”

要么

绑定地址=“0.0.0.0”

  • 评论“跳过networking”

如果你的MySQLconfiguration文件中有一个“skip-networking”行,通过在该行的开始处加上“#”符号来进行注释。

  • 改变“wait_timeout”和“interactive_timeout”

将这些行添加到MySQLconfiguration文件中:

wait_timeout = 数字

interactive_timeout = 数字

connect_timeout = 数字

  • 确保Java不是将“localhost”翻译为[::: 1]而不是[127.0.0.1]

由于MySQL能够识别127.0.0.1(IPv4)而不是::: 1(IPv6)

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

选项#1:在连接string中使用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。 如果iptablesconfiguration错误,它们可能允许将tcp数据包发送到mysql端口,但阻止tcp数据包返回到同一个连接。

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

在Windows上停止防病毒软件。

  • 更改连接string

检查你的查询string。 你的连接string应该是这样的东西:

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

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

尝试用环回地址127.0.0.1replace“localhost”。 也尝试添加端口号到您的连接string,如:

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

通常MySQL的默认端口是3306。

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

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

“ max_allowed_pa​​cket ”是MySQLconfiguration文件中的一个variables,它表示最大数据包大小,而不是最大数据包数量。 所以这不会有助于解决这个错误。

  • 改变tomcat的安全性

将TOMCAT6_SECURITY = yes更改为TOMCAT6_SECURITY = no

  • 使用validationQuery属性

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

  • autoReconnect的

将此代码添加到连接string中:

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

虽然没有这些解决scheme为我工作,我build议你去尝试一下。 因为有些人按照这些步骤解决了他们的问题。

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

我的问题是,我有很多的数据库select。 每次我创build一个连接,然后closures它。 虽然我每次都closures连接,但系统面临着很多连接,并给了我这个错误。 我所做的是我定义我的连接variables作为整个类的公共(或私人)variables,并在构造函数中初始化它。 然后每次我只是用这个连接。 它解决了我的问题,也大大提高了我的速度。

结论

没有简单而独特的方法来解决这个问题。 我build议你考虑一下自己的情况,select上面的解决scheme。 如果在程序开始时出现此错误,并且根本无法连接到数据库,则连接string中可能有问题。 但是,如果在与数据库成功交互之后出现这个错误,问题可能在于连接数量,您可能会考虑更改“wait_timeout”和其他MySQL设置,或者重新编写代码,以减less连接数量。

如果你正在使用MAMP PRO,这个简单的修复,我真的希望我已经在我开始search互联网的日子之前,已经意识到这一点。 它真的很简单

您只需从MAMP MySQL选项卡中单击“允许networking访问MySQL”。

真的,那就是了。

哦,你可能还是要把你的绑定地址改成0.0.0.0或127.0.0.1(如上面的post所述),但是如果你是MAMP用户,单独单击这个框可能会解决你的问题。

bind-address设置为服务器的networkingIP而不是本地主机默认值,并在我的用户上设置权限。

my.cnf文件:

 bind-address = 192.168.123.456 

MySql控制台:

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

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

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

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

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

在我的情况下,这是一个空闲的超时,导致连接被删除在服务器上。 连接保持开放,但不能长时间使用。 然后客户端重新启动工作,而我相信重新连接也将工作。

一个不错的解决scheme是有一个守护进程/服务来连接ping连接。

就我而言,

  1. /etc/mysql/my.cnf更改远程计算机的mysqlconfiguration:将bind-address = 127.0.0.1改为#bind-address = 127.0.0.1

  2. 在远程计算机上,使用GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';更改mysql用户权限GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';

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

对我来说,解决办法是在mysql服务器的conf文件中将参数bind-address =“127.0.0.1”或bind-address =“xxxx”更改为bind-address =“0.0.0.0”。 谢谢。

我刚刚面临同样的问题。 发生这种情况是因为MySQL守护程序被绑定到了机器的IP地址,这是与有权连接@your_machine的用户build立连接所必需的。 在这种情况下,用户应具有连接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 

如果您遇到了一系列Docker容器的问题 ,请确保您不仅EXPOSE 3306端口,而且还要从container -p 3306:3306之外映射端口。 对于docker-compose.yml

 version: '2' services: mdb: image: mariadb:10.1 ports: - "3306:3306" … 

这发生在我没有足够的MySQL内存的情况下。 重新启动修复了它,但是如果是这种情况,请考虑使用更多内存的nachine,或者限制jvms占用的内存

转到控制面板中的Windows服务并启动MySQL服务。 对我来说,它的工作。 当我正在做一个Java EE项目时,我得到了这个错误“通信链接失败”。 我重新启动我的系统,然后它的工作。

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

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

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

如果你使用的是hibernate,那么这个错误可能会导致保持打开Session对象的时间比wait_timeout

我在这里为有兴趣的人logging了一个案例。

我find了解决scheme

因为MySQL需要本地主机才能工作。

/ etc / network / interfaces文件,并确保你在那里设置了localhostconfiguration:

 auto lo iface lo inet loopback 

现在重新启动networking子系统和MySQL服务:

sudo /etc/init.d/networking restart

sudo /etc/init.d/mysql重新启动

现在就试试

主要是因为mysql客户端和远程mysql服务器连接不好。

在我的情况下,这是因为片状VPN连接。

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

Soheil提供的决议在我的情况下是成功的。

为了澄清,我需要做的唯一的改变是MySQL的服务器configuration;

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

我为我的应用程序使用外部MySQL服务器。 这是一个带有MySQL Server 5.5的基本Debian 7.5安装 – 默认configuration。

重要:

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

文件

 /etc/mysql/my.cnf 

线

 bind-address = 192.168.0.103 #127.0.0.1 

重新启动您的MySQL服务器服务:

 /usr/sbin/service mysql restart 

正如你所看到的,我只是提供了服务器的networkingIP,并注释掉了默认条目。 请注意,只要复制和粘贴我的解决scheme不适合你,除非我们的主机有一些奇迹,共享相同的IP。

谢谢@ Soheil

我遇到类似的问题,我的情况的解决scheme是

  1. 从127.0.0.1更改绑定地址= 0.0.0.0
  2. 将url的localhost更改为localhost:3306

我感觉到的是我们不应该放弃,我试图从这个post和其他论坛的每一个选项以及…快乐的作品@saurab

我也面临这个问题。

正如Soheilbuild议的,我去了php.ini文件的pathC:\ windows \ php.ini,然后我修改了这个文件中的端口号。

这是在线mysqli.default_port = ……….

所以我改变了我的Java应用程序,因为它在php.ini文件中,现在它可以正常工作。

我知道这是一个古老的线程,但我已经尝试了很多东西,并使用以下方法解决了我的问题。

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

在两个系统上都安装了名为“jtm”的MySQL数据库。 出于某种原因,在我的代码中,我的数据库名称为“JTM”。 在Windows上,它工作得很好,实际上它在几个Windows系统上飞行。

在Ubuntu上,我得到了一次又一次的错误。 我在代码“jtm”中用正确的大小写来testing它,并且它可以工作。

Linux对于区分大小写的情况显然不那么宽容(正确的话),而Windows则允许这样做。

我现在觉得有些蠢,但是检查一切。 错误信息并不是最好的,但如果你坚持不懈并把事情做好,那么它似乎是可以解决的。

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

我在MacOS(10.10.2)和MySql(5.6.21)通过自制程序安装了同样的问题。

令人困惑的是,我的应用程序连接到数据库的罚款,而另一个没有。

在应用程序尝试了很多东西,抛出exceptioncom.mysql.jdbc.CommunicationsException这个问题的接受的答案build议无济于事,我很惊讶,重新启动MySQL的工作。

我的问题的原因可能是上述链接的答案中提出的以下内容:

你在使用连接池吗? 如果是,则尝试重新启动服务器。 连接池中的连接可能很less处于closures状态。

对于Windows: – 转到开始菜单写,“MySqlserver实例configuration向导”,并重新configuration您的MySQL服务器实例。 希望它能解决你的问题。

经过多年的同样的问题,没有永久性的解决scheme,这是什么解决了它在过去三周(这是无差错操作logging)

设置全局wait_timeout = 3600;
设置全局interactive_timeout = 230400;

如果它适合你,不要忘记使这永久。

在我的情况下(我是一个noob),我正在testing使MySQL与数据库连接的Servlet,其中一个Exception是上面提到的一个。

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

那么, 检查一下MySQL服务器是否正常运行

如果使用本地模拟器,则必须使用IP地址10.0.2.2而不是本地主机来访问本地MySQL服务器。