无法通过 Tomcat 或外部的 JDBC 连接器连接到 mysql

Ste*_*all 21 mysql tomcat jdbc

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

我正在使用以下网址:

jdbc:mysql://myserver.com:myport/mydb
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

和 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)
Run Code Online (Sandbox Code Playgroud)

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

Bod*_*den 21

发生这种情况的原因有多种。几周前我自己才看到它,但我不记得修复对我来说是什么。

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

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

3) 对mysql 正在侦听的端口进行两次和三次检查。

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

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

我认为我的第一个建议最有希望……事实上,我认为这就是我最近看到的……我试图远程连接到 mysql(也在 Ubuntu 8.04 上)。

  • 关于“您必须注释掉 my.cnf 中的 bind-address 参数以绑定到所有可用地址”,默认情况下现在仅在 localhost 上侦听,因此您可能需要使用“bind-address = 0.0.0”行。 [mysqld] 中的 0.0"。 (2认同)

小智 13

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

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.
Run Code Online (Sandbox Code Playgroud)

我花了几天时间来解决这个问题。我已经测试了不同网站中提到的许多方法,但没有一个有效。最后我更改了我的代码并找出了问题所在。我将尝试向您介绍不同的方法并在此处进行总结

当我在互联网上寻找此错误的解决方案时,我发现有许多解决方案至少适用于一个人,但其他人说它对他们不起作用! 为什么有很多方法可以解决这个错误?当连接到服务器时出现问题时 ,似乎通常会发生此错误。问题可能是因为查询字符串错误或与数据库的连接过多。

所以我建议你一一尝试所有的解决方案,不要放弃!

以下是我在互联网上找到的解决方案,对于每个解决方案,至少有人通过该解决方案解决了他的问题。

要点:需要更改MySQL设置的解决方案,可以参考以下不:

  • Linux:/etc/my.cnf

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

以下是解决方案:

  • 更改“绑定地址”属性

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

绑定地址="127.0.0.1"

或者

绑定地址="0.0.0.0"

  • 注释掉“跳过网络”

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

  • 更改“wait_timeout”和“interactive_timeout”

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

wait_timeout =数字

Interactive_timeout =数字

连接超时 =数字

  • 检查操作系统代理设置

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

  • 更改连接字符串

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

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
Run Code Online (Sandbox Code Playgroud)

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

尝试将“localhost”替换为您的端口,例如 127.0.0.1。还可以尝试将端口号添加到您的连接字符串中,例如:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
Run Code Online (Sandbox Code Playgroud)

通常 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 属性

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

  • 自动重连

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

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
Run Code Online (Sandbox Code Playgroud)

尽管这些解决方案都不适合我,但我建议您尝试一下。因为有些人是如何按照这些步骤解决他们的问题的。

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

结论

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