MySQL"语句关闭后不允许任何操作"

时间:2014-08-10 02:00:05

标签: java mysql sql jdbc connector-j

我遇到了一个奇怪的情况,准备好的声明使用MySQL Connector / J命中MySQL数据库。在某些环境中,我会定期遇到更长的现有(> 5分钟)准备语句的问题。调用executeBatch时,我经常会遇到异常:

“声明关闭后不允许任何操作”

但是,没有代码可以关闭我能看到的语句。代码如下所示:

private void execute(MyClass myObj, List<MyThing> things) throws SQLException {
    Connection con = null;
    PreparedStatement pstmt = null;

    try {
        con = ConnectionHelper.getConnection();
        pstmt = con.prepareStatement(INSERT_SQL);
        int c = 0;

        for (MyThing thing : things) {
            pstmt.setInt(1, myObj.getA());
            pstmt.setLong(2, thing.getB());
            pstmt.addBatch();

            if (++c % 500 == 0) {
                pstmt.executeBatch();
            }
        }

        pstmt.executeBatch();
    }
    finally {
        ConnectionHelper.close(pstmt, con);
    }
}

ConnectionHelper.close本质上只是在语句和连接上调用close。 ConnectionHelper.getConnection有点像兔子洞 - 它大致使用java.sql.DriverManager和proxool从池中检索连接,然后用Spring DataSourceUtils包装它。

通常它会在最后一个pstmt.executeBatch()上失败,但有时会在其他地方失败。我已经检查并且wait_timeout和interactive_timeout被配置为默认值(绝对> 5分钟)。此外,在大多数情况下,连接和语句在循环中使用,但几秒钟后语句在循环外部失败。数据库服务器和应用服务器在同一子网上运行,因此网络问题似乎不太可能。

寻找有关如何调试此问题的任何提示 - 目前,我正在尝试深入研究MySQL Connector / J代码,看看我是否能够以某种方式获得一些额外的调试语句。不幸的是,我无法附加调试器,因为它目前只能在特定的耦合环境中重现。

1 个答案:

答案 0 :(得分:0)

看看这一行:

            if (++c % 500 == 0) {
                pstmt.executeBatch();
            }

如果执行会发生什么,但循环终止。然后再次调用pstmt.executeBatch,批处理中没有任何内容。