4

我有循环遍历对象队列的代码,这些对象描述了需要存储在 MySQL 数据库中的信息。我最近稍微更改了代码以关闭finally整个应用程序中的一个块中的连接,以便在发生异常时我们不会泄漏任何内容。它工作得很好,除了:

有些用户有时会看到错误No operations allowed after resultset closed- 我知道错误的含义,但我不知道如何关闭它。

违规代码:

    PreparedStatement s = null;
    Connection conn = null;

    try {

        if( !queue.isEmpty() ){

            conn = Prism.dbc();
            if(conn == null || conn.isClosed()){
                return;
            }
            conn.setAutoCommit(false);
            s = conn.prepareStatement("INSERT query goes here");
            int i = 0;
            while (!queue.isEmpty()){
                Handler a = queue.poll();
                if( a == null || a.isCanceled() ) continue;
                // .. value setting code here
                s.addBatch();
                if ((i + 1) % perBatch == 0) {
                    s.executeBatch(); // Execute every x items.
                }
                i++;
            }

            s.executeBatch();
            conn.commit();

        }
    } catch (SQLException e) {
        // error logging code
    } finally {
        if(s != null) try { s.close(); } catch (SQLException e) {}
        if(conn != null) try { conn.close(); } catch (SQLException e) {}
    }

错误指向该conn.setAutoCommit(false);行。但是,我看不到此时连接是如何关闭的,因为我正在显式检查其上方的已关闭/空连接。

4

2 回答 2

0

我在堆栈跟踪中发现的核心问题是: 2013-03-31 13:21:11 [SEVERE] Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 30,491,788 milliseconds ago. The last packet sent successfully to the server was 30,491,788 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

调用时获得的连接Prism.dbc();实际上是来自连接池的连接;在这种特定情况下,池连接被破坏。它表示池中的 JDBC 连接与数据库之间的通信超过 8 小时没有成功。也许是因为wait_timeout在数据库服务器上定义的提到的或防火墙断开了连接或任何东西;连接中断的原因可能有很多。

您应该按照异常提出的建议来解决此问题。

于 2013-03-31T17:43:19.247 回答
-1

此问题的最可能原因是 JDK 版本和所使用的 DB 驱动程序不兼容。

查看此链接:http ://dev.mysql.com/downloads/connector/j ,它提供了各种版本的 DB 驱动程序。

编辑:

请参阅此链接以获取 jdk 和驱动程序映射:http ://dev.mysql.com/doc/refman/5.1/en/connector-j-versions-java.html 。

编辑:

我之所以说这是最可能的原因,是因为与 DB 合作的经验。我不认为这是代码问题,因为它对某些人有用。使用不兼容的驱动程序可能会导致奇怪的问题,例如您所面临的问题。我在使用 Oracle DB 时遇到过这样的问题,我能够执行所有查询,但合并查询导致连接关闭,问题是由于驱动程序不兼容造成的。

所以我根据我的经验这么说。

我也觉得即使这不是问题的确切原因[它最可能的问题原因]如果用户可以发布驱动程序版本和 jdk 版本我们肯定可以排除这种情况,这篇文章肯定可以帮助人们,所以我不明白否决票的原因。

于 2013-03-31T16:12:31.050 回答