JDBC垃圾回收

3
如果我没有关闭结果集或准备语句会发生什么?
它们会被垃圾回收器关闭和释放吗?
我是针对函数内的局部变量提出这个问题的。
您知道任何相关文档吗?
5个回答

9

1

1

在使用JDBC驱动程序时,您必须明确关闭ResultSet和Statement对象。这适用于您创建的所有ResultSet和Statement对象。驱动程序没有终结器方法;清理例程由ResultSet和Statement类的close()方法执行。如果您不明确关闭ResultSet和Statement对象,则可能会发生严重的内存泄漏。您还可能在数据库中用尽游标。关闭结果集和语句都会释放数据库中相应的游标;如果只关闭结果集,则不会释放游标。


1
如果我没有关闭结果集或准备好的语句,它们会被垃圾收集器关闭和释放吗?
通过显式调用close方法来关闭resultset和preparedstatement。垃圾收集器不会关闭它们。如果您不调用close,则Oracle游标不会在Oracle端释放。
Will they be released by the garbage collector.

一般情况下,在Java中,一个对象会在以下情况下成为垃圾回收的候选者:

  • 所有指向该对象的引用都显式地设置为null,例如:object = null
  • 对象是在块内创建的,并且一旦控制退出该块,引用就会超出范围。
  • 父对象设置为null。如果一个对象持有另一个对象的引用,并且你将容器对象的引用设置为null,则子对象或包含对象自动成为垃圾回收的候选者。
  • 如果一个对象仅通过WeakHashMap具有活动引用,则它将成为垃圾回收的候选者。

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

在方法内创建ResultSet对象,没有关闭并且引用超出范围,一旦控制退出该方法,引用就会被设置为null,对象就有资格进行垃圾回收。我说过“有资格”,而不是保证。底层的Oracle游标仍然存在于数据库中,因为你没有调用close。


0

-> 如果我不关闭resultset或preparedstatements会发生什么?它们会被垃圾回收器关闭和释放吗?。

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

关闭或处理(JDBC资源)对象意味着这些对象现在可供垃圾回收,并且GC将释放已获取的任何JDBC资源。

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

请查看以下文章 - 最佳实践:关闭和释放JDBC资源Java SE 7和JDBC 4.1的增强功能(来自本文的文本 - 功能:使用try-with-resources语句自动关闭Connection、ResultSet和Statement类型的资源)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接