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 没有影响的主要内容,如果未能解决你的问题,请参考以下文章
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设定