MySQL JDBC closeOnCompletion 对 PreparedStatement 没有影响

Posted

技术标签:

【中文标题】MySQL JDBC closeOnCompletion 对 PreparedStatement 没有影响【英文标题】:MySQL JDBC closeOnCompletion has no effect on 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) 【参考方案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。你能检查一下你使用的是那个版本吗?

【讨论】:

他正在使用 java 7 的新特性 - docs.oracle.com/javase/tutorial/essential/exceptions/… ResultSet 正在被 try-with-resources 块关闭;如果closeOnCompletion 被正确实现,这也应该导致Statement 的关闭。

以上是关于MySQL JDBC closeOnCompletion 对 PreparedStatement 没有影响的主要内容,如果未能解决你的问题,请参考以下文章

jsp页面中怎么导入jdbc连接mysql

mysql jdbc驱动不能加载问题

在eclipse里jdbc连接mysql 怎么安装

com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定

使用 JDBC 访问远程 MySQL 数据库时出现 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定