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

Posted

技术标签:

【中文标题】com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障?【英文标题】:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure? 【发布时间】:2014-12-31 00:19:19 【问题描述】:

我正在运行带有 hibernate.cfg 的 Spring MVC 应用程序,如下所示:

    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
    <property name="dialect">org.hibernate.dialect.mysqlDialect</property>
    <property name="hibernate.connection.useUnicode">true</property>
    <property name="hibernate.connection.characterEncoding">UTF-8</property>
    <property name="hibernate.connection.charSet">UTF-8</property>
    <property name="connection.url">jdbc:mysql://10.2.10.123:3306/xxx</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.username">xxx</property>
    <property name="generate_statistics">false</property>
    <property name="connection.password">xxx</property>
    <property name="c3p0.testConnectionOnCheckout">true</property>
    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="c3p0.acquire_increment">1</property> 
    <property name="c3p0.idle_test_period">100</property> <!-- seconds --> 
    <property name="c3p0.max_size">50</property> 
    <property name="c3p0.max_statements">0</property> 
    <property name="c3p0.min_size">10</property> 
    <property name="c3p0.timeout">7200</property>
    <property name="current_session_context_class">thread</property>
    <property name="c3p0.numHelperThreads">5</property>
    <property name="show_sql">false</property>

当我在本地环境中运行应用程序时,它运行没有任何问题。但是在服务器上它给出了异常:

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

从服务器成功接收到的最后一个数据包是 206,756 毫秒前。最后一个成功发送到服务器的数据包是在 3 毫秒前。

我进一步得到以下日志:

Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3119)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3573)
    ... 90 more
DEBUG: 11:42:41.858 com.mchange.v2.resourcepool.BasicResourcePool.trace(BasicResourcePool.java:1644) - trace com.mchange.v2.resourcepool.BasicResourcePool@2b5cccf1 [managed: 7, unused: 6, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5700187d)
DEBUG: 11:42:41.861 com.mchange.v2.resourcepool.BasicResourcePool.decrementPendingAcquires(BasicResourcePool.java:422) - decremented pending_acquires: 0
DEBUG: 11:42:41.858 com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:967) - Successfully destroyed resource: com.mchange.v2.c3p0.impl.NewPooledConnection@61b03322
DEBUG: 11:42:41.861 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.finerLoggingTestPooledConnection(C3P0PooledConnectionPool.java:323) - Test of PooledConnection [com.mchange.v2.c3p0.impl.NewPooledConnection@c2beb14] on CHECKOUT has FAILED.
java.sql.SQLException: Connection is invalid

谁能帮忙?

【问题讨论】:

尝试在 MySQL 连接属性中设置 set auto connect true 【参考方案1】:

我通过将 MySQL 服务器上的 wait_timeout 和 interactive_timeout 的值增加到 3600 秒(1 小时)来解决这个问题,之前两者都设置为 60 秒。

【讨论】:

【参考方案2】:

就我而言,我在尝试从同一主机连接到在 Ubuntu 主机 VM 上的容器内运行的 mysql-server 时遇到此错误。

示例: 如果我的 VM 名称是 abc.company.com,则以下 jdbc URL 将不起作用

jdbc:mysql://abc.company.com:3306/dbname

上面的 jdbc url 可以在 xyz.company.com 等其他机器上正常工作,但不是 abc.company.com

下面的 jdbc URL abc.company.com 机器上可以正常工作

jdbc:mysql://localhost:3306/dbname

这导致我检查了/etc/hosts 文件。

将以下行添加到/etc/hosts 解决了这个问题:

127.0.1.1 abc.company.com abc

这似乎是一个操作系统错误,需要我们在某些 Ubuntu 版本上添加这些。 参考:https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_hostname_resolution

在尝试此之前,我已经尝试了所有其他解决方案,例如 GRANT ALL..,更改了 mysql.cnf 中的 bind-address 行。在这种情况下,它们都没有帮助我。

【讨论】:

以上是关于com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障?的主要内容,如果未能解决你的问题,请参考以下文章

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:重复条目 '' 键 'PRIMARY'

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

错误 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表不存在

使用 JDBC 访问远程 MySQL 数据库时出现 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

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