用什么来确保连接池始终关闭?

时间:2014-03-10 18:53:02

标签: java connection pool finalizer

我知道终结器使用起来很糟糕,即使是连接关闭(Is closing the connection in finalize best practice?),因为它们不能保证被调用。但是,如果您的连接通过连接池汇集怎么办?就我而言,我正在使用Apache Commons池(http://commons.apache.org/proper/commons-pool/)来汇集SFTP连接。我不能使用try-with-resources技术,因为每次尝试结束时都不应该关闭每个连接(以便池可能会重复使用它以进行下一个操作)。

我提供了一个调用pool.close()的closePool()方法,这样无论程序员使用我的代码都可以调用它,但是如果她/他忘了这样做呢?从终结器调用此方法是尝试关闭连接池的最佳解决方案,以防它不是手动完成,还是有更好的方法?关闭钩子会更好地工作吗?

1 个答案:

答案 0 :(得分:1)

如果您正在编写一个向其他人提供此功能的库,除了提供closePool()方法之外,我真的不知道您还能做些什么。您可以让您的类继承自java.io.Closeable和/或AutoCloseable,但除了宣传清理资源的需要之外,您通常必须依赖开发人员使用您的代码来做正确的事情

如果未正确实现库代码中的意外终结器可能会遇到令人讨厌的事情。

您可以尝试添加一个关闭挂钩,但是如果JVM正在关闭,那么在那时强行关闭连接池没有多大意义。