com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障

我的程序连接到MySQL数据库工作正常。 然后,不更改任何代码用于build立连接,我得到这个exception:

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. 

发生了什么?

用于获取连接的代码:

 private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException { String username = "user"; String password = "pass"; String url = "jdbc:mysql://www.domain.com:3306/dbName?connectTimeout=3000"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, password); return conn; } 

这是一个包装的exception,并不是很有趣。 这是例外的根本原因 ,它实际上告诉了我们一些关于根本原因的事情。 请在堆栈跟踪中稍微查看一下。 这个机会很大,您将面临一个SQLException: Connection refusedSQLException: Connection timed out

如果你的情况也是如此,那么所有可能的原因是:

  1. JDBC URL中的IP地址或主机名是错误的。
  2. 本地DNS服务器无法识别JDBC URL中的主机名。
  3. JDBC URL中缺less端口号或错误。
  4. 数据库服务器已closures。
  5. 数据库服务器不接受TCP / IP连接。
  6. Java和DB之间的东西阻塞连接,例如防火墙或代理。

要解决这一个或两者,请按照以下build议:

  1. 使用pingvalidation并testing它们。
  2. 刷新DNS或使用JDBC URL中的IP地址。
  3. 根据my.cnfvalidation。
  4. 启动它。
  5. validationmysqld是否在没有--skip-networking选项的情况下启动。
  6. 禁用防火墙和/或configuration防火墙/代理以允许/转发端口。

顺便说一下(并且与实际问题无关),您不一定需要在每个 getConnection()调用上加载JDBC驱动程序。 在启动期间只有一次就够了。

检查在数据库服务器上设置的等待超时时间。 有时它默认为10秒。 这在10秒内失去连接。

 mysql> show global variables like '%time%' ; 

更新它使它像28800

 mysql> SET GLOBAL wait_timeout = 28800; 

我也有这个问题约8-9天。 这里有一些背景:我正在开发一个简单的Java应用程序,运行在bash中。

细节:

  • spring2.5.6
  • Hibernate3.2.3.ga
  • 随着maven。 (该项目的基础来自mkyong.com,春季教程没有说明)
  • MySQL版本:
  [jvazquez @ archbox〜] $ mysql --version
 mysql Ver 14.14 Distrib 5.5.9,用于Linux(i686),使用readline 5.1
 Linux archbox 2.6.37-ARCH#1 SMP PREEMPT Fri Feb 18 16:58:42 UTC 2011 i686 Intel(R)Core(TM)2 Quad CPU Q8200 @ 2.33GHz GenuineIntel GNU / Linux 

该应用程序在Arch Linux,Mac OS X 10.6和FreeBSD 7.2中运行良好。 当我将jar文件移动到其他主机上的另一个arch linux时,使用相同的mysql,一个类似的my.cnf和类似的内核版本,连接死了,并获得与原始海报相同的错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败

我尝试了所有可能的组合,因此我在论坛上find了这个组合( http://forums.mysql.com/read.php?39,180347,180347#msg-180347例如,现在已经closures了,; t后..),具体为:

  • 三重检查,我没有使用跳过networking。 (用ps aux和my.cnfvalidation)
  • 尝试在my.cnf启用log_warnings = 1,但显然,我没有击中服务器,所以我没有看到任何东西,而使用应用程序
  • 显示引擎innodb状态没有显示任何东西; 在testing期间我可以通过shell连接,并且php也连接到mysql服务器
  • / etc / hosts有localhost 127.0.0.1
  • 尝试使用本地主机和127.0.0.1 jdbc属性没有结果
  • 尝试添加c3p0并改变了max_wait
  • my.cnf中的最大连接数已经更改为900,2000,但仍然没有my.cnf
  • 增加了wait_timeout = 60 my.cnf
  • 新增net_wait_timeout = 360 my.cnf
  • 添加了destroy-method =“close” spring.xml

正如它指出的(如果你查找相同的exception,你会发现几个这样的线程关于这个问题重现com.mysql.jdbc.exceptions.jdbc4.CommunicationsException与设置Spring,hibernate和C3P0例如)。

  1. 如果你正在使用tomcat,请检查安全exception(再次,它是这样的,你会发现它)
  2. 检查您是否可以parsing您正在使用的url
  3. 尝试添加c3p0。
  4. 确认没有防火墙拒绝您的连接
  5. 最后,如果您使用的是GNU / Linux(例如ARch linux,您确实获得了这个例外),请尝试MySQL论坛:: JDBC和Java :: EOFException:无法读取来自服务器的响应。 预期读取4个字节,在连接意外丢失之前读取0个字节

如果链接被删除,只需将mysqld:ALL添加到/etc/hosts.allow即可

我知道这有点夸张 ,但它可以帮助任何人使用GNU / Linux,并有这个例外,这个线程似乎是最好的地方张贴我的研究。

希望它有帮助

我得到了同样的错误,但后来我发现它是因为Mysql服务器当时没有运行

所以要改变服务器的状态

  1. 转到任务pipe理器
  2. 去服务
  3. 然后search你的Mysql服务器(例如:对于我的情况下它的MYSQL56)
  4. 那么你会在状态栏下看到它说没有运行
  5. 通过右键单击并select开始

希望这会有所帮助。

我们有一个软件(与Tomcat的Web应用程序)使用Apache公共连接池,工作了很多年。 在过去的一个月里,由于我们遇到了一个旧的bug,我不得不更新这些库。 该错误已在最近的版本中修复。

在部署这个之后不久,我们开始得到这些消息。 在成千上万的连接中,我们会得到一天,less数(通常在10以下)会得到这个错误信息。 没有真正的模式,除了他们有时会聚集在2至5人的小组中。

我将选项更改为在池中,以便在每次从池中取出或放回池时validation连接(如果发现错误,则会生成新的连接),问题就消失了。

你最近更新了你的MySQL jar吗? 似乎可能会有一个新的设置,在我们的(不可否认的是非常古老的)jar子里不存在。

我同意BalusC在你的configuration上尝试一些其他选项,比如你传递给MySQL的那些选项(除了连接超时之外)。

如果这个失败像我的那样是短暂的,而不是永久性的,那么你可以使用一个简单的try / catch和一个循环来继续尝试,直到事情成功或者使用连接池来处理你的细节。

其他随机的想法:我不知道为什么你尝试使用一个封闭的连接(你得到的例外)会发生什么情况。 你会不小心closures连接的地方?

确保跳过networking在my.cnf / my.ini中被注释掉

正如BalusC所提到的那样,发布完整的堆栈跟踪(总是发布一个完整的堆栈跟踪,仅有堆栈跟踪的第一行是无用的和令人沮丧的)将是非常有用的。

无论如何,你提到你的代码工作正常,并且这个问题突然发生,没有任何代码改变,所以我想知道这是否可能与你有关其他问题debugging时没有closures数据库连接的问题? 其实,如果这个问题是在debugging的时候开始的,那么我认为是(你没有连接)。 在这种情况下,重新启动数据库服务器(并按照其他问题的build议来避免这种情况)。

我遇到了同样的问题。 我正在使用spring&dbcp&mysql 5.5But如果我将localhost更改为192.168.1.110那么一切正常。 更奇怪的是mysql -h localhost正常工作。

更新:终于find了解决办法。 在my.conf中将my.conf更改为localhost127.0.0.1将解决此问题。

在我的情况下,本地环回接口没有启动,所以“localhost”无法parsing。 你可以通过运行“ifconfig”来检查,你会看到一个名为“lo”的接口。 如果没有启动,可以通过运行“ifup lo”或“ifconfig lo up”来激活它。

在我的情况下, mysql.com下载的Connector / J 5.1.29 .jar有这个错误,从MvnRepository下载5.1.29 .jar没有

在Android Studio(gradle,Windows x64)中构buildGoogle appengine应用程序时发生这种情况,并与本地networking/本地VM上的Linux MySQL服务器进行通信。

我看到你正在连接到远程主机。 现在问题是你使用什么types的networking连接到互联网?

视窗

如果它是移动宽带设备,那么得到你的机器的IP地址,并把它添加到你的主机服务器上,这样你的主机服务器可以允许来自你的机器的连接[你的主机可能因为安全原因closures了这个function]。 请注意,每次使用不同的networking设备时,IP都会发生变化。

如果您使用的是局域网,请在您的机器上设置一个静态IP地址,然后将其添加到您的主机。

我希望这有帮助!! 🙂

使用具有特定语句的java.sql.PreparedStatement时,出现通信失败错误。

这是在Windows 7 x64机器上针对MySQL 5.6,Tomcat 7.0.29和JDK 1.7.0_67运行的。

原因原来是设置一个整数到一个string参数和一个string到一个整数参数然后试图执行executeQuery在准备好的语句。 在我更正了参数设置的顺序后,语句正确执行。

这与networking问题没有任何关系,正如错误消息的build议。

最重要的问题是Mysql JDBC池连接没有被使用,然后从Mysql中超时,closures连接。 您需要更改池参数以在连接失败时获得重新启动连接,方法如下:

Connection Validation :必需(检查)
Validation Method:自动提交

如果无法使用,您可以更改validation方法!

如果您使用WAMP,请确保它在线。 我所做的是,首先把我的防火墙closures,然后它的工作,所以之后,我允许连接所有本地端口,特别是端口80.比我摆脱了这个问题。 对我来说是防火墙阻止了连接。

我有同样的问题,我使用了大部分的参数(autoreconnect等),但没有尝试(test_on_idle,或test_on_connect),我要去做下一步。

不过,我有这个黑客,让我通过这个:

我有一个称为Healthcheck的cron作业,它每10分钟唤醒一次,并对服务器进行REST API调用。 networking/应用程序服务器捡起来,连接到数据库,做了一个小小的改变,并回来了'是在西部正面安静'或'shitshappening'。 当后者发送传呼机/电子邮件给正确的人。

它总是保持数据库连接池的新鲜副作用。 只要这个cron正在运行,我没有db连接超时的问题。 否则,他们出现了。