2017-10-21 44 views
0

對於JDBC連接,我知道Java將創建一個帶有端口號的開放式套接字,並且在它與數據庫服務器之間建立一個開放式連接,並具有指定的端口號,數據庫名稱也許還有其他的選擇,關閉這個資源顯然是需要的。聲明對象擁有什麼資源

但是對於Statement,與ResultSet一起,他們擁有的資源是什麼,所以我們需要關閉它們?我的意思是技術上的。

+0

對於ResultSet,它是數據庫遊標。基本上,數據庫並不總是急切地檢索所有結果 - 相反,它會保留對結果本身的引用的臨時索引並按需檢索它們。關閉「ResultSet」時資源將被釋放。 對於'PreparedStatement'(通常不適用於普通的'Statement'),在服務器上準備好的語句。 –

+1

@PiotrWilkin爲什麼使用評論回答?你可以發佈這個作爲一個真正的答案。 –

回答

1

資源是否實際由語句或結果集持​​有,很大程度上取決於特定的數據庫和驅動程序。

Java中的一個Statement可能在數據庫中有一個對應(語句句柄),一些語句的內存,超時,讀取大小,緩衝區等配置。對於普通的Statement,情況並非總是如此,但對於PreparedStatement數據庫中的語句句柄通常會保存編譯語句的版本及其執行計劃等。

在Java中關閉語句對象將在數據庫中釋放此句柄(或者可能釋放它以供重用不同的語句),並且可能例如釋放對元數據的「存在鎖定」(例如,防止表在被使用/準備時被丟棄)。另外,在Java中關閉語句將關閉所有打開的結果集,然後可以釋放Java和數據庫中的內存。

關閉結果集本身也有明顯的好處,結果集可能會保存Java中的內存(例如預取行,有時是完整結果),因此關閉結果集將釋放預取行和空閒內存。如果您尚未完全讀取結果集,或者您正在使用可滾動結果集,則這尤其適用。

結果集還可能在數據庫端有一個指向最後一行的數據庫的遊標(或類似的數據庫),鎖定行(例如在for update select語句中),也可能包含一些預定義的在內存中獲取行。關閉結果集將釋放內存和任何鎖等。

換句話說:是的,你應該關閉結果集和語句,你應該儘快完成它們。