2011-12-28 145 views
1

如果我不關閉結果集或準備語句,會發生什麼情況。JDBC垃圾回收

它們會被垃圾收集器關閉和釋放嗎?

我在問函數內的局部變量。

你知道關於這方面的任何文檔嗎?

回答

7

如果您的代碼在完成使用後未關閉ResultSet s或PreparedStatement s,那麼應用程序會在數據庫中佔用稀有資源(如遊標)。參見,例如:

垃圾收集器並不知道關閉ResultSet秒或PreparedStatement什麼事,所以GC不會自動的照顧,對你。會怎樣? Java 7's try-with-resources statement

1

您必須顯式關閉完成後使用它們的ResultSet和Statement對象。這適用於您在使用JDBC驅動程序時創建的所有ResultSet和Statement對象。司機沒有終結方法;清理例程由ResultSet和Statement類的close()方法執行。如果您沒有明確關閉您的ResultSet和Statement對象,則可能會發生嚴重的內存泄漏。您也可能會用完數據庫中的遊標。關閉結果集和語句會釋放數據庫中相應的遊標;如果只關閉結果集,光標不會釋放

1

如果我不關閉結果集或預處理語句,它們將被關閉 並由垃圾收集器發佈。

resultsetpreparedstatment被關閉,通過顯式調用close方法。垃圾收集器不會關閉這些。我不打電話close,那麼oracle的遊標不會在oracle端釋放。

Will they be released by the garbage collector. 

通常一個物體變得有資格在Java垃圾收集在以下情況:

  • 明確設置爲NULL對象的所有引用如object = null
  • 在塊內創建對象,並在控件退出該塊時引用超出範圍。
  • 父對象設置爲空,如果一個對象擁有另一個對象的引用,並且當您設置容器對象的引用爲null,則子對象或包含對象將自動變爲符合垃圾回收條件。
  • 如果一個對象只有通過WeakHashMap的實時引用,它將有資格進行垃圾回收。

的提問:我問這一個 函數內部的局部變量。

ResultSet在一個方法內創建的對象,沒有關閉並且引用超出範圍,一旦控制權退出該方法。,那麼引用設置爲null,並且對象有資格進行垃圾回收。我說沒有保證資格。底層的Oracle遊標仍然存在於數據庫中,因爲你沒有關閉。

0

- >如果我不關閉ResultSet或用預處理會發生什麼?他們會被垃圾收集器關閉並釋放嗎?

這樣就會降低數據庫和應用程序的性能。您必須關閉或處置JDBC resource properly

close or dispose(JDBC資源)對象表示這些對象現在可用於垃圾回收,GC將釋放已獲取的任何JDBC資源。

如果是ResultSet對象,當調用Statement.close()方法時它會自動關閉。您可以撥打ResultSet.close()方法,如果你想明確地關閉ResultSet對象(閱讀文章 - 5.1.20 Closing a ResultSet Object)

看一看文章 - Best Practice: Closing and releasing JDBC resourcesEnhancements in Java SE 7 and JDBC 4.1(文字從這篇文章 - 特點:使用一試的能力-with資源語句類型連接,ResultSet和語句的自動關閉資源)