JDBC垃圾回收

如果我不关闭结果集或预备语句会发生什么。

它们是否会被垃圾收集器关闭并释放。

我问这个函数里面的局部变量。

你知道关于这个的任何文件吗?

如果你的代码在使用then时没有关闭ResultSetPreparedStatement ,你的应用程序将在数据库中占用稀缺的资源 – 比如游标。 例如,见:

  • 连接关闭时ResultSet未关闭?
  • 从方法返回到新对象时,原始resultSet会发生什么?

垃圾收集器对结束ResultSetPreparedStatement没有任何了解,因此GC不会自动为您处理。 会是什么? Java 7的try -with-resources语句 !

我不是这里的专家,但我不认为GC可以收集,因为PS与数据库连接相关联,因此不会收集垃圾。 哟可以看看这里: http : //www.theserverside.com/news/1365244/Why-Prepared-Statements-are-important-and-how-to-use-them-properly

完成使用后,必须显式关闭ResultSet和Statement对象。 这适用于您在使用JDBC驱动程序时创建的所有ResultSet和Statement对象。 司机没有终结者方法; 清理例程由ResultSet和Statement类的close()方法执行。 如果未显式关闭ResultSet和Statement对象,则可能发生严重的内存泄漏。 您也可以在数据库中用完游标。 关闭结果集和语句会释放数据库中的相应游标; 如果仅关闭结果集,则不会释放光标

如果我不关闭结果集或准备好的语句。它们将被垃圾收集器关闭并释放。

通过显式调用close方法关闭resultsetpreparedstatment 。 垃圾收集器不会关闭这些。 我没有调用close ,那么oracle游标没有在oracle端释放。

 Will they be released by the garbage collector. 

通常,在以下情况下,对象有资格在Java中进行垃圾回收:

  • 该对象的所有引用都显式设置为null,例如object = null
  • 在块内创建对象,并且一旦控制退出该块,引用就会超出范围。
  • 父对象设置为null,如果对象保存另一个对象的引用,并且当您将容器对象的引用设置为null时,子对象或包含对象将自动符合垃圾回收的条件。
  • 如果一个对象只有通过WeakHashMap的实时引用,它将有资格进行垃圾回收。

对于你的问题:我问这个函数内部的局部变量。

ResultSet在方法内部创建的对象,未关闭且引用超出范围,一旦控制退出该方法。 ,然后将引用设置为null并且对象符合垃圾回收的条件。 我确实说有资格不保证。底层的oracle游标仍在数据库中。因为你没有调用close。

– >如果我不关闭结果集或预备语句会怎样? 它们会被垃圾收集器关闭和释放吗?

这样就会降低数据库和应用程序的性能。 您必须正确关闭或处置JDBC资源 。

close or dispose (JDBC资源)对象意味着这些对象现在可用于垃圾收集,GC将释放已获取的任何JDBC资源。

对于ResultSet对象,它将在调用Statement.close()方法时自动关闭。 如果要显式关闭ResultSet对象,可以调用ResultSet.close()方法(阅读文章 – 5.1.20关闭ResultSet对象) 。

查看文章 – 最佳实践: 在Java SE 7和JDBC 4.1中 关闭和发布JDBC资源和增强function (本文中的文本 – function:使用try-with-resources语句自动关闭Connection类型的资源的能力, ResultSet和Statement)