2013-04-10 83 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