2011-12-28 131 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和语句的自动关闭资源)