【问题标题】:MySQL Communications link failure due to underlying exception由于底层异常导致 MySQL 通信链接失败
【发布时间】:2011-10-26 00:04:07
【问题描述】:


我正面临如此烦人的问题,
使用 Tomcat JDBC Lib 在 Tomcat 6 和 MySQL 上运行。

com.mysql.jdbc.CommunicationsException: 

由于底层异常导致通信链接失败:

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException

STACKTRACE:

java.io.EOFException
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1934)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2380)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2909)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1695)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3026)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1137)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1231)

经过一段时间(20 分钟)后,到 db 的所有连接似乎都过期了。

autoReconnect=true" 
validationQuery="Select 1"

一切都准备好了。
我确实处理重新连接到数据库,它工作正常,但是巨大的日志文件很糟糕,我不能处理这个异常以使其保持沉默。这种类型的“修复”也不是正确的解决方案。有什么办法:
a) 静默处理此异常
b) 修复此问题(我没有任何我知道的防火墙)(无权访问 my.cnf 进行 mysql 配置)

在完全不同的应用程序上使用 Apache jConnector 在 Tomcat 5 上也存在此问题,没有任何可能断开连接的防火墙。

(在调用连接的方法上捕获 EOFException 或 CommunicationsException 不会当然有帮助。)

提前致谢。

【问题讨论】:

  • 你的 JDBC URL 是什么?我假设autoReconnect=true 是 URL 的一部分?你在哪里定义validationQuery
  • url="jdbc:mysql://adress/dbName?autoReconnect=true" validationQuery="Select 1"
  • @BShip 定义的validationQuery 在哪里?
  • 在 context.xml 的同一行 wheres url
  • 对不起,我对 Tomcat 的配置一无所知。我看不出这有什么问题。在我看来,你在做正确的事。祝你好运。

标签: java mysql tomcat jdbc eofexception


【解决方案1】:

a) 停止 MySQL 数据库服务器和应用程序服务器(Tomcat 或其他)。

b) Mysql 设置:这应该在 mysql 文件夹下的“my.ini”文件中完成。

wait_timeout =1200(即 20 分钟 - 与您的防火墙或任何其他第三方软件保持相同的时间)

您可以通过上述查询设置它的数据库级别。设置 wait_timeout =1200;

通过上述查询查看设置显示变量,如'wait_timeout';

c) 在“Torque.properties”文件中添加两个属性。

minEvictableIdleTimeMillis A 连接可以在池中保持空闲的时间(以毫秒为单位)

    torque.dsfactory.csa.pool.minEvictableIdleTimeMillis = 1100000

#timeBetweenEvictionRunsMillis 驱逐线程运行之间的时间,以毫秒为单位;必须大于 0;默认为 -1

  torque.dsfactory.csa.pool.timeBetweenEvictionRunsMillis = 2000


    d) Start application and db server

【讨论】:

    【解决方案2】:

    使用命令 /s 检查 MYSQL 的状态 现在检查您在代码中提到的端口号,它应该与 MYSQL 端口匹配 如果端口号不同,请更改它

    (jdbc:mysql://localhost:3306/mrt) 在这个例子中,我的端口号是 3306

    【讨论】:

      【解决方案3】:

      您需要在资源中的 server.xml 文件中设置 MaxIdle 和 Timeout 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-20
        • 2013-11-30
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 2021-01-12
        相关资源
        最近更新 更多