解决方案如下:

解决方案如下:

我已经安装了库存的 mysql 5.5 安装,虽然我可以通过 mysql 命令连接到 mysql 服务,并且该服务似乎正在运行,但我无法通过 spring+tomcat 或从外部 jdbc 连接器连接到它。

我正在使用以下网址:

jdbc:mysql://myserver.com:myport/mydb

使用正确的用户名/密码,但我收到以下消息:

server.com: 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.

并且 tomcat 抛出:

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.
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

这似乎与我尝试外部连接时遇到的问题相同。

答案1

发生这种情况的原因有很多。几周前我亲眼见过这种情况,但我记不清该如何解决。

1) 验证 mysql 绑定到的地址,它可能是 127.0.0.1(仅此而已),我相信这是默认值(至少在标准 Ubuntu 服务器上)。您必须注释掉 my.cnf 中的 bind-address 参数,才能绑定到所有可用地址(您不能选择多个,只能选择一个或全部)。

2) 如果它绑定到 127.0.0.1 并且您无法使用“localhost”连接,请确保它没有解析为 IPv6 本地主机地址而不是 IPv4。(或者只使用 IP 地址)

3)再三检查mysql正在监听的端口。

4)确保您使用了适合您的JDK的正确的JDBC连接器。

5)确保您没有做一些非常愚蠢的事情,例如使用--skip-networking启动mysql。

我认为我的第一个建议最有希望......事实上我认为那是我最近看到它的地方......我试图远程连接到 mysql(也在 Ubuntu 8.04 上)。

答案2

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

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/my.cnf

  • Windows:D:\Program Files\mysql\bin\my.ini

解决方案如下:

  • 更改“bind-address”属性

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

绑定地址=“127.0.0.1”

或者

绑定地址=“0.0.0.0”

  • 注释掉“skip-networking”

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

  • 更改“wait_timeout”和“interactive_timeout”

将以下行添加到 MySQL 配置文件:

等待超时=数字

interactive_timeout=数字

连接超时=数字

  • 检查操作系统代理设置

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

  • 更改连接字符串

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

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

最大允许数据包数“是 MySQL 配置文件中的一个变量,它表示最大数据包大小,而不是最大数据包数量。因此,它无助于解决此错误。

  • 更改 tomcat 安全性

将 TOMCAT6_SECURITY=yes 更改为 TOMCAT6_SECURITY=no

  • 使用 validationQuery 属性

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

  • 自动重新连接

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

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

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

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

结论

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

答案3

如果您正在运行 Linux 安装,则可能已让 lokkit 阻止除通过 SSH 之外的传入通信。

以 root 身份登录,并从提示符运行命令 lokkit,禁用防火墙和 SElinux,看看是否遇到同样的问题。

还要检查您的权限是否已正确设置,以便所有内容都可以写入正确的位置。

答案4

这也可能是由于错误代理设置。我在尝试通过 jdbc 连接到 Mac 上的 Parallels 虚拟设备中运行的 MySQL 实例时遇到了这个问题。jdbc 连接使用系统级网络设置,由于我使用的是 SOCKS 代理,因此我必须将 MySql 主机设置为非代理主机(例如,在 Mac 上,您可以在设置->网络->高级->代理中进行配置,最后在“绕过这些主机和域的代理设置”中添加主机名或 IP 地址)。

相关内容