【问题标题】:Closing a Database Connection (or similar resource) : Finally{} v/s Finalize()关闭数据库连接(或类似资源):Finally{} vs Finalize()
【发布时间】:2013-12-04 14:56:32
【问题描述】:

我最近在一次采访中被问到这个问题。

Q1 :您应该在 servlet 中的何处关闭数据库连接?

A :理想情况下,在我遇到的大多数实际应用程序中,数据库连接在 finally 块中关闭。

Q2:为什么不在 Finalize 方法中?

A : 这取决于应用程序的要求。是否要求我们让应用程序保持打开状态,直到我们到达垃圾收集点,以便我们可以利用资源/对象池并摆脱在需要重新建立连接时可能涉及的一些开销,或者想要一个安全的故障安全方法,一旦我们完成连接,它将继续并关闭连接。

Q3 在 finally 或 Finalize 中关闭它的优缺点是什么?在做出决定时,您会考虑哪些问题因素?

问题 3 的理想答案是什么。

【问题讨论】:

    标签: servlets jdbc database-connection connection-pooling


    【解决方案1】:

    永远不要像 Joshua Bloch 在 Effective Java 中指出的那样依赖 Finalize

    这是一个链接,但考虑阅读 Effective java 书

    the link

    the book

    【讨论】:

      【解决方案2】:

      Q1:应该在 servlet 中的何处关闭数据库连接?

      我的观点: 从分层架构的角度来看,您应该有单独的层,例如数据访问层,以处理不直接在您的 servlet 中的数据库连接。 您应该始终在 finally 块中关闭\释放资源(数据库连接等)。

      Q2:为什么不在 Finalize 方法中?

      我的观点: 通常,finally 块是保证块,即使在失败条件下也会执行您的代码。但是 Finalize 方法不能保证在您实际直接/间接调用它时会调用它。垃圾收集器将在收集合格对象之前调用该方法。

      Q3 在 Finalize 或 Finalize 中关闭它的优缺点是什么?

      我的观点:因为它不能保证是否会调用 finalize() 以及保留资源直到 finalize 调用的不良做法。

      底线:

      尽可能晚地创建/调用资源并尽早释放资源 可能。

      希望这会有所帮助..

      干杯!

      【讨论】:

      • 是的,'servet' 是一个错字。我确实是指“servlet”。这听起来像是一个很好的解释。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2021-11-26
      • 2014-01-19
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多