AutoCloseable Iterator到ResultSet的调用是否应该从终结器调用?

时间:2015-03-11 18:31:35

标签: java iterator resultset finalizer autocloseable

我有一个由ResultSet支持的Iterator。我需要进行行级后处理。迭代器实现AutoCloseable接口。 在我们遍历用户中断的所有行/迭代之前,连接保持打开状态。如果迭代器的使用者显式调用close()方法或者在Java7 try块中包含迭代器的使用,那么一切都很好。但是,如果消费者没有这样做,我无法保证连接将返回到池中。在C#world中,我们会做一个终结器并从终结器调用Dispose(bool)作为后备选项。我们应该在Java中做同样的事吗?

1 个答案:

答案 0 :(得分:2)

这种清理通常不是在Java finalize()方法中完成的。未能确保正确处理资源是编程错误;在编程错误之后尝试清理启用继续不良做法。

更常见的是一个调试选项,可以帮助那些承认他们遇到问题的开发人员。通常,默认情况下不启用此选项,因为涉及开销,但是当打开右侧标志时,将在分配资源时创建堆栈跟踪。如果在没有正确销毁资源的情况下调用finalize(),则会记录堆栈以显示泄漏的位置。

finalize()周围有很多警告,你通常应该避免它。在这种情况下的一个主要问题是,不能保证它将被调用,即使它是,它可能没有及时帮助。