MySQL JDBC closeOnCompletion对PreparedStatement没有影响

时间:2013-04-10 10:20:01

标签: java mysql jdbc prepared-statement

JDBC引入了一个名为 closeOnAutoCompletion 的方法,当所有相关的resultSet都关闭时,它声明它会关闭语句。

我有一个创建预备语句的方法

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

感谢, 缪奇

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

根据this announcement,MySQL Connector / J的版本5.1.21(MySQL的JDBC驱动程序的官方名称)应该支持 closeOnAutoCompletion 。你能检查一下你使用的是那个版本吗?