我的两个程序都遇到了相同的问题。我的错误是这样的:
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设置的解决方案,可以不参考以下内容:
以下是解决方案:
取消注释“绑定地址”属性或将其更改为以下Ips之一:
bind-address =“ 127.0.0.1”
要么
绑定地址=“ 0.0.0.0”
如果您的MySQL配置文件中有“跳过网络”行,请在该行的开头添加“#”号使其成为注释。
- 更改“ wait_timeout”和“ interactive_timeout”
将这些行添加到MySQL配置文件中:
wait_timeout = 数字
Interactive_timeout = 数字
connect_timeout = 数字
确保防火墙或防病毒软件不会阻止MySQL服务。
检查您的查询字符串。您的连接字符串应如下所示:
dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
确保您的字符串中没有空格。所有连接字符串应继续,且不包含任何空格字符。
尝试用端口(例如127.0.0.1)替换“ localhost”。也尝试将端口号添加到您的连接字符串中,例如:
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_packet
“ max_allowed_packet ”是MySQL配置文件中的一个变量,指示最大包大小,而不是最大包数。因此,这无助于解决此错误。
将TOMCAT6_SECURITY =是更改为TOMCAT6_SECURITY =否
使用validationQuery =“ select now()”确保每个查询都有响应
将此代码添加到您的连接字符串中:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
尽管这些解决方案都不适合我,但我建议您尝试一下。因为有人遵循这些步骤如何解决他们的问题。
但是什么解决了我的问题?我的问题是我在数据库上有很多SELECT。每次创建连接然后关闭它。尽管我每次都关闭连接,但是系统面临许多连接,并给了我这个错误。我所做的是,我将连接变量定义为整个类的公共(或私有)变量,并在构造函数中对其进行了初始化。然后,每次我使用该连接时。它解决了我的问题,也大大提高了我的速度。
结论
没有简单独特的方法可以解决此问题。我建议您考虑自己的情况并选择上述解决方案。如果在程序开始时出现此错误,并且根本无法连接到数据库,则连接字符串可能有问题。但是,如果在与数据库进行多次成功交互之后出现此错误,则问题可能出在连接数上,您可能会考虑更改“ wait_timeout”和其他MySQL设置,或者重写代码以减少连接数。