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


17

我已经安装了一个普通的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)

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


当尝试通过Java连接到在我局域网中另一台服务器上运行的mysql数据库时,我遇到了这个问题。当在运行mysql的服务器上执行相同的Java程序时,它的连接没有问题。例如,可以从外部计算机使用SQLYog连接到mysql数据库(尽管我首先必须将my.cnf文件更改为绑定到0.0.0.0而不是127.0.0.1)。Boden的回答以及有关更改JDBC连接器的评论为我指明了正确的方向。我将JDBC连接器更改为最新版本,然后突然起作用了!
user2380870

Answers:


18

发生这种情况可能有多种原因。几周前我才亲自看到它,但我不记得该修复了什么。

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上也是如此)。


仅添加2cent,第4个对我有用。谢谢!
Janis Peisenieks,2012年

1
关于“您必须注释掉my.cnf中的bind-address参数以绑定到所有可用地址”,默认值为现在仅侦听localhost,因此您可能需要使用“ bind-address = 0.0”行。 [mysqld]中为0.0“。
Palo

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.

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

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

因此,我建议您一个接一个地尝试所有解决方案,不要放弃!

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

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

  • Linux:/etc/my.cnf

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

以下是解决方案:

  • 更改“绑定地址”属性

取消注释“绑定地址”属性或将其更改为以下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_pa​​cket

max_allowed_pa​​cket ”是MySQL配置文件中的一个变量,指示最大包大小,而不是最大包数。因此,这无助于解决此错误。

  • 更改tomcat的安全性

将TOMCAT6_SECURITY =是更改为TOMCAT6_SECURITY =否

  • 使用validationQuery属性

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

  • 自动重新连接

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

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

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

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

结论

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


我也有这个问题!但是我最初将mysql更改为侦听8888端口,而不是3306端口。所以,@ sohail的回答有所帮助,我只是将8888端口添加到我的uri中,并且它起作用了!感谢一堆

这为我解决了问题!使用我们的Vagrant Homestead安装程序时,由于某种原因,它绑定到了给VM的地址(在我的情况下为10.0.2.15)而不是本地主机。
兰德2015年

1

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

以root用户身份登录,然后在提示符下运行命令lokkit,禁用防火墙和SElinux,然后查看是否存在相同的问题。

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


我正在运行Ubuntu 8.04。我可能应该提到这一点。您有该发行版的具体说明吗?一会儿我会用谷歌搜索,但我想我先问一下。
Stefan Kendall

sudo ufw disable将禁用Ubuntu防火墙
Stephen Thompson

我安装了ufw,并尝试启用端口,但没有骰子。
Stefan Kendall

ufw和iptables已被卸载。我以为ufw是必须单独安装的管理工具。果然,“ iptables”不会产生这样的命令,并且似乎没有iptables服务正在运行。
Stefan Kendall

好的,最后我经常发现的事情是您没有使mysql能够在eth0接口上侦听,并且通常只能在localhost接口上侦听。请尝试以下方法。如果可行,将jdbc:mysql://myserver.com:myport / mydb更改为jdbc:mysql:// localhost:myport / mydb,您需要执行以下dev.mysql.com/doc/refman/5.1/en/ can-not-connect-to-server.html
Stephen Thompson,2009年


1

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


1

MySQL Connector / J仅支持TCP / IP Java不支持Unix域套接字连接

如果MYSQL以跳过网络标志启动,或者MySQL在防火墙后面运行,则将禁用TCP / IP选项。因此,Java无法与MySQL通信。


0

我有将近一天的时间遇到​​了类似的问题,这让我发疯了!但是我设法找到了解决方案,它非常非常简单,您只需要/etc/init.d/tomcat6即可将TOMCAT6_SECURITY = yes更改为TOMCAT6_SECURITY = no。这不是我的解决方案,我在这里找到,如您所见,我正在运行ubuntu,希望它能奏效。


0

我有同样的问题。将/etc/mysql/my.cnf文件中的“ bind-address”属性更改为0.0.0.0,并且可以使用。my.cnf中的对应行如下所示:

绑定地址= 0.0.0.0

在将其设置为服务器的外部ip地址之前,其外观类似于:

绑定地址= 196.152.4.145

我认为,当将其设置为外部ip地址而不是localhost循环时,mysql服务器仅连接到网卡,并且不侦听来自本地循环的连接。


0

尝试将您的本地地址绑定到my.cnf文件中的地址

连接con = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.