【问题标题】:What's the cause of (and treatment for) this java MySQL exception?这个 java MySQL 异常的原因(和处理)是什么?
【发布时间】:2011-01-30 04:08:00
【问题描述】:

在一段时间不活动后执行第一个preparedstatement时出现以下异常:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 2,855,054 milliseconds ago.  The last packet sent successfully to the server was 123 milliseconds ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3052)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2938)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3481)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2228)

仅当我的应用程序最近没有与 MySQL 通信时才会显示。后续查询正常执行。我怀疑这是某种超时问题,但不活动的时间远低于 MySQL 的 8 小时超时。

有什么建议吗?

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    您使用的是连接池吗?如果是这样,您只需打开连接池检查/监控,这样您就可以确保您的客户端线程每次都能获得有效的 MySQL 连接。大多数池都有一种方法可以指定在借用连接之前或有时甚至在空闲期间在后台执行的低工作量 SQL(以提高性能,但有可能向客户端线程发出一些错误连接)。

    另外,w.r.t. time

    【讨论】:

    • 我没有使用连接池,因为它似乎没有必要,但也许我错了。你有推荐的池实现吗?
    • Apache 的 DBCP (commons.apache.org/dbcp) 非常好,包含您正在寻找的功能。作为正面和负面的,它独立于任何其他正在使用的软件组件工作。如果您正在使用任何类型的应用服务器,它可能已经预先集成了连接池以及生命周期事件(启动我的池,终止我的池)。
    • 经过一番搜索,我决定使用c3p0,这似乎已经解决了问题。感谢您的建议。
    【解决方案2】:

    在一段时间不活动后执行第一个preparedstatement时出现以下异常

    这只是我的猜测 - MySQL 连接在一段时间不活动后默认关闭,因为数据库连接是宝贵的资产,因此它们应该由代码很好地管理。

    检查关于数据库连接控制的代码,你可能会在那里找到答案。虽然通过 MySQL 超时设置超时值为 8 小时 - 在您的代码中(或在其他人的代码中?)仍然有可能,连接将在一段时间不活动后关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2010-10-31
      • 2021-09-14
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多