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

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

我正在使用以下url:

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)validationmysql绑定的地址,它可能是127.0.0.1(仅),我相信这是默认的(至less在标准的Ubuntu服务器上)。 你必须注释my.cnf中的绑定地址参数绑定到所有可用的地址(你不能select多个,它是一个或全部)。

2)如果绑定到127.0.0.1,并且不能使用“localhost”连接,请确保它不是parsing到IPv6本地主机地址而是IPv4。 (或只使用IP地址)

3)双击和三重检查mysql正在监听的端口。

4)确保你正在为你的JDK使用正确的JDBC连接器。

5)确保你没有像使用–skip-networking启动mysql那样做一些非常愚蠢的事情。

我认为我的第一个build议是最有前途的…实际上,我认为这是我最近看到的…我试图远程连接到mysql(也在Ubuntu 8.04上)。

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

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

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

以下是解决scheme:

  • 改变“绑定地址”属性

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

绑定地址=“127.0.0.1”

要么

绑定地址=“0.0.0.0”

  • 评论“跳过networking”

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

  • 改变“wait_timeout”和“interactive_timeout”

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

wait_timeout = 数字

interactive_timeout = 数字

connect_timeout = 数字

  • 检查操作系统代理设置

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

  • 更改连接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都应该继续,没有任何空格字符。

尝试用你的端口replace“localhost”,比如127.0.0.1。 也尝试添加端口号到您的连接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它。 尽pipe我每次都closures了连接,但系统面临着很多连接,并给了我这个错误。 我所做的是我定义我的连接variables作为整个类的公共(或私人)variables,并在构造函数中初始化它。 然后每次我只是用这个连接。 它解决了我的问题,也大大提高了我的速度。

结论

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

如果您正在运行Linux安装,您可能会阻止传入的通信,除非通过SSH。

以root身份login,然后从提示符运行lokkit命令,禁用防火墙和SElinux,看看是否有同样的问题。

另外检查你的权限是否设置正确,所以一切都可以写入正确的位置。

mysql-jdbc驱动程序5.1.9版中也有这个巨大的bug:

http://bugs.mysql.com/bug.php?id=47494

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

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

如果MYSQL以跳过networking标志启动,或者MySQL在防火墙后面运行,则TCP / IP选项被禁用。 所以Java不能和MySQL通信。

我有一个非常类似的问题差不多一天,这让我疯狂! 但我设法find了解决scheme,而且非常非常简单,只需要/etc/init.d/tomcat6即可将TOMCAT6_SECURITY = yes更改为TOMCAT6_SECURITY = no。 这不是我的解决scheme,我发现它在这里 ,你可以看到,我运行的Ubuntu,希望这个工程。

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

bind-address = 0.0.0.0

在它被设置为服务器的外部IP地址之前,它看起来像这样:

bind-address = 196.152.4.145

我想当它设置为外部IP地址,而不是本地主机循环,MySQL服务器只是连接到网卡,不听从本地环路的连接。

尝试使用本地地址绑定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(); }