Servlets 关闭数据库连接(或类似资源):最后{}v/s Finalize()

Servlets 关闭数据库连接(或类似资源):最后{}v/s Finalize(),servlets,jdbc,database-connection,connection-pooling,Servlets,Jdbc,Database Connection,Connection Pooling,我最近在一次采访中被问到这个问题 Q1:在servlet中,应该在哪里关闭数据库连接 答:理想情况下,在我遇到的大多数实际应用程序中,数据库连接在Finally块中关闭 问题2:为什么不使用Finalize方法 答:这取决于申请的要求。它是否要求我们将应用程序保持打开状态,直到达到垃圾收集点,以便我们可以利用资源/对象池,并消除在需要重新建立连接时可能涉及的一些开销,或者想要一个安全的故障保护方法,一旦我们完成连接,它将继续并关闭连接 Q3最终完成或最终确定的利弊是什么?在做出这个决定时你会考虑

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

Q1:在servlet中,应该在哪里关闭数据库连接

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

问题2:为什么不使用Finalize方法

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

Q3最终完成或最终确定的利弊是什么?在做出这个决定时你会考虑哪些因素?
问题3的理想答案是什么?

千万不要像Joshua Bloch在《高效Java》中所说的那样依赖Finalize

这是一个链接,但是考虑阅读有效的java书


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

我的观点:从分层体系结构的角度来看,您应该有一个类似数据访问层的独立层来处理数据库连接,而不是直接在servlet中。 您应该始终在finally块中关闭\释放资源(数据库连接等)

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

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

Q3最终完成或最终确定的利弊是什么?

我的观点:因为不能保证是否会调用finalize(),而且将资源保留到finalize调用之前的错误做法

底线:

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

希望这会有帮助


干杯

是的,“servet”是一个拼写错误。我的意思是“servlet”。这听起来是一个很好的解释。谢谢