【问题标题】:MySQL JDBC closeOnCompletion has no effect on PreparedStatementMySQL JDBC closeOnCompletion 对 PreparedStatement 没有影响
【发布时间】:2013-04-10 10:20:00
【问题描述】:

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 版

谢谢, 渚

【问题讨论】:

  • 也许关闭是异步的?退出 try 子句后尝试睡眠一段时间。如果它没有帮助您发现自己的错误:)
  • 完全有可能是MySQL驱动还没有实现这个。
  • 确实是非常新的实现。但是我想在打开错误之前检查我是否做错了
  • 我打开了一个错误bugs.mysql.com/bug.php?id=68916 实现看起来更像一个占位符(StatementImpl Line 3041)

标签: java mysql jdbc prepared-statement


【解决方案1】:

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

【讨论】:

  • 它使用 try-with-resources。 Java 会在 try 块结束时自动调用ResultSet.close() 方法。
  • 顺便说一句:你怎么知道它不支持它,5.1.21 release announcement 似乎表明它是支持的
  • 我查看了实现(5.1.24),实现看起来更像是一个占位符。一个标志加上 API 方法。我的 IDE 无法在 mysql 驱动程序内部找到方法/标志的任何用法。关于考试。结果集已关闭。我还检查了是否还有其他打开的结果集。没有。所以这应该可行,因为它是最简单的用例。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 2016-01-28
  • 2020-11-10
  • 2015-11-04
  • 2010-12-01
  • 2013-10-07
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多