2013-04-10 64 views
2

JDBC引入了一个名为closeOnAutoCompletion的方法,该方法声明当所有相关resultSets都关闭时,它会关闭语句。MySQL JDBC closeOnCompletion对PreparedStatement没有影响

我要创建准备好的语句

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

感谢, 缪奇

+0

也许关闭是异步的?退出try子句后尝试睡眠一段时间。如果它没有帮助你发现自己的bug :) – 2013-04-10 10:36:01

+0

这是完全可能的MySQL驱动程序还没有实现这一点呢。 – 2013-04-10 10:44:02

+0

确实是非常新的实现。但是我想在打开一个bug之前检查我是否做错了什么 – Muki 2013-04-10 10:54:24

回答

2

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

+0

它使用试用资源。 Java会在try块的末尾自动调用ResultSet.close()方法。 – 2013-04-10 14:42:33

+0

顺便说一句:你怎么知道它不支持它,[5.1.21发布公告](http://forums.mysql.com/read.php?3,559877,559877)似乎表明它支持 – 2013-04-10 14:44:19

+0

我查看了实现(5.1.24),实现看起来更像是一个占位符。一个标志加上API方法。我的IDE无法在mysql驱动程序内部找到方法/标志的任何用法。 关于测试。结果集关闭。我还检查了是否有其他打开的结果集。不。所以这应该起作用,因为它是最简单的用例。 – Muki 2013-04-11 11:16:03

-1

this announcement,MySQL的连接器/ J的5.1.21版本(JDBC驱动程序的正式名称对于MySQL)应该支持closeOnAutoCompletion。你能检查你正在使用该版本吗?

+0

他正在使用java 7的新特性 - http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – 2013-04-10 10:33:24

+2

“ResultSet”正在被try-with-resources块关闭;如果'closeOnCompletion'被正确执行,这应该导致'Statement'关闭。 – 2013-04-10 10:45:45