2

JDBC 引入了一种称为closeOnAutoCompletion的方法,它声明当所有相关的结果集都关闭时,它会关闭语句。

我有一种创建准备好的语句的方法

public final PreparedStatement statement(Connection connection) throws SQLException {
    PreparedStatement stmt = connection.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY,
            ResultSet.CONCUR_READ_ONLY);
    stmt.closeOnCompletion();
    return stmt;
}

不,我按如下方式调用此方法

@Test
public void testCloseOnCompletionSemiManually() throws SQLException {
    PreparedStatement stmt = shards.statement(db);
    assertTrue("Statement must be closeOnAutoCompletion", stmt.isCloseOnCompletion());

    try (ResultSet rs = stmt.executeQuery()) {
        while (rs.next()) {
            //System.out.println("Shard id: " + rs.getInt("SHARD_ID"));
        }
    }
    assertTrue("Statement must be closed after all results sets have been processed", stmt.isClosed());
}

最后一次检查失败,因为语句没有关闭。

这是由于mysql实现的问题吗?还是我误解了 JavaDoc。

更新:我使用的是 5.1.24 版

谢谢,穆基

4

2 回答 2

2

驱动还不支持,但是测试也不正确。请注意,Statement 的 API 文档说 closeOnCompletion() 在所有相关结果集都关闭时关闭语句,而不是滚动到末尾,所以我不确定在您的情况下实际假设发生了什么行为。

于 2013-04-10T14:06:59.687 回答
-1

根据这个公告,MySQL Connector/J(MySQL 的 JDBC 驱动程序的正式名称)版本 5.1.21 应该支持closeOnAutoCompletion。你能检查你使用的是那个版本吗?

于 2013-04-10T10:27:48.563 回答