它们会被垃圾回收器关闭和释放吗?
我是针对函数内的局部变量提出这个问题的。
您知道任何相关文档吗?
ResultSet
或PreparedStatement
后没有关闭它们,那么您的应用程序将会占用数据库中稀缺的资源(如游标)。例如,请参见:
垃圾回收器不知道如何关闭ResultSet
或PreparedStatement
,因此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
在使用JDBC驱动程序时,您必须明确关闭ResultSet和Statement对象。这适用于您创建的所有ResultSet和Statement对象。驱动程序没有终结器方法;清理例程由ResultSet和Statement类的close()方法执行。如果您不明确关闭ResultSet和Statement对象,则可能会发生严重的内存泄漏。您还可能在数据库中用尽游标。关闭结果集和语句都会释放数据库中相应的游标;如果只关闭结果集,则不会释放游标。
Will they be released by the garbage collector.
一般情况下,在Java中,一个对象会在以下情况下成为垃圾回收的候选者:
对于你的问题: 我是在问函数内部的局部变量。
在方法内创建ResultSet对象,没有关闭并且引用超出范围,一旦控制退出该方法,引用就会被设置为null,对象就有资格进行垃圾回收。我说过“有资格”,而不是保证。底层的Oracle游标仍然存在于数据库中,因为你没有调用close。
-> 如果我不关闭resultset或preparedstatements会发生什么?它们会被垃圾回收器关闭和释放吗?。
这样做会降低数据库和应用程序的性能。您必须正确关闭或处理JDBC资源。
关闭或处理(JDBC资源)对象意味着这些对象现在可供垃圾回收,并且GC将释放已获取的任何JDBC
资源。
对于ResultSet
对象,当调用Statement.close()
方法时,它将自动关闭。如果要显式关闭ResultSet
对象,则可以调用ResultSet.close()方法(阅读文章-5.1.20 关闭ResultSet对象)。