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

Java com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障,java,mysql,jdbc,Java,Mysql,Jdbc,我连接到MySQL数据库的程序运行良好。然后,在不更改用于设置连接的任何代码的情况下,我得到以下异常: 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

我连接到MySQL数据库的程序运行良好。然后,在不更改用于设置连接的任何代码的情况下,我得到以下异常:

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;
}

这是一个包装的异常,并不是很有趣。异常的根本原因实际上告诉了我们一些关于根本原因的信息。请进一步查看stacktrace。然后您很有可能会遇到
SQLException:Connection-densed
SQLException:Connection-timed-out

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

  • JDBC URL中的IP地址或主机名错误
  • 本地DNS服务器无法识别JDBC URL中的主机名
  • JDBC URL中缺少端口号或端口号错误
  • 数据库服务器已关闭
  • DB服务器不接受TCP/IP连接
  • Java和DB之间的某些东西正在阻止连接,例如防火墙或代理
  • 要解决其中一个问题,请遵循以下建议:

  • ping
    验证并测试它们
  • 刷新DNS或改用JDBC URL中的IP地址
  • 根据MySQL数据库的
    my.cnf
    进行验证
  • 开始吧
  • 验证mysqld是否在没有
    --skip networking
    选项的情况下启动
  • 禁用防火墙和/或配置防火墙/代理以允许/转发端口

  • 顺便说一句(与实际问题无关),您不必在每次调用
    getConnection()
    时都加载JDBC驱动程序。启动期间只需一次就足够了。

    我们有一个使用Apache commons连接池的软件(带有Tomcat的webapp),多年来一直运行良好。上个月,由于遇到一个老bug,我不得不更新库。该漏洞已在最新版本中修复

    在部署这个之后不久,我们就开始得到这些消息。在我们每天收到的数千个连接中,有少数(通常不到10个)会收到此错误消息。没有真正的模式,只是它们有时会聚集在2到5个小组中

    我将选项更改为on the pool,以便在每次从池中取出或放回池中时验证连接(如果发现一个连接不好,则生成一个新的连接),问题就消失了

    你最近更新过你的MySQL jar吗?看起来可能有一个新的设置在我们(承认是非常旧的)罐子里不曾出现过

    我同意BalusC在您的配置中尝试一些其他选项,例如您要传递给MySQL的选项(除了连接超时)

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


    另一个随机想法:我不知道为什么尝试使用封闭连接会发生什么情况(会出现什么异常)。您可能在某处意外关闭了连接吗?

    正如BalusC所提到的,发布完整的堆栈跟踪非常有用(始终发布完整的堆栈跟踪,只有堆栈跟踪的第一行是无用的,也是令人沮丧的)


    无论如何,您提到您的代码工作正常,并且这个问题在没有任何代码更改的情况下突然发生,因此我想知道这是否与您的其他问题有关,如果这个问题是在调试时开始的,那么我想是(您的连接已用完)。在这种情况下,请重新启动数据库服务器(并按照另一个问题的建议来避免这种情况)。

    我也已经有了8-9天的时间。 以下是一些背景:我正在开发一个在bash中运行的简单Java应用程序

    详情:

    • 春季2.5.6
    • Hibernate3.2.3.ga
    • 和maven在一起。 (该项目的基础来自mkyong.com,这是一个没有命名的春季教程)
    • MySQL版本:
    [jvazquez@archbox~]$mysql——版本 mysql版本14.14发行版5.5.9,适用于Linux(i686),使用readline 5.1 Linux archbox 2.6.37-ARCH#1 SMP抢占周五2月18日16:58:42 UTC 2011 i686 Intel(R)Core(TM)2四CPU Q8200@2.33GHz GenuineIntel GNU/Linux 该应用程序在ArchLinux、MacOSX10.6和FreeBSD7.2中运行良好。 当我使用相同的mysql、类似的my.cnf和类似的内核版本将jar文件移动到另一台不同主机中的arch linux时,连接中断,并获得与原始海报相同的错误:

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

    我尝试了在so和论坛上找到的所有可能的组合(例如,现在已经关闭,我无法发布…),特别是:

    • 三次检查我没有使用skip 网络。(与ps aux核实) 和my.cnf)
    • 尝试在my.cnf中启用log_warnings=1,但很明显,我没有点击 所以我在使用应用程序时没有看到任何东西
    • 显示引擎innodb状态根本没有显示任何内容;在测试期间,我可以通过shell连接,php也可以连接到mysql服务器
    • /etc/hosts具有localhost 127.0.0.1
    • 使用localhost和127.0.0.1尝试jdbc属性,但没有结果
    • 尝试添加c3p0并更改了最大等待时间
    • my.cnf中的最大连接数已更改为9002000,但my.cnf中仍然没有任何连接
    • 添加了等待超时=60 my.cnf
    • 添加了净等待超时=360 my.cnf
    • 添加了destroy method=“close”spring.xml
    正如所指出的(如果您查找相同的异常,您将发现关于该问题的几个so线程) 例如)

  • 如果您使用的是tomcat,请检查安全异常(同样,它是打开的,所以您会找到它)
  • C [jvazquez@archbox ~]$ mysql --version mysql Ver 14.14 Distrib 5.5.9, for Linux (i686) using 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
    mysql> show global variables like '%time%' ;
    
    mysql> SET GLOBAL wait_timeout = 28800;