gpt4 book ai didi

java - finally block 关闭资源真的可靠吗?更新了代码片段

转载 作者:行者123 更新时间:2023-12-02 08:41:22 24 4
gpt4 key购买 nike

我想知道finally block 是否真的可靠地关闭资源;例如,数据库连接?

根据我们的架构师的说法,finally block 关闭数据库连接并不可靠,尤其是在 Web 应用程序场景中。

根据理论,无论代码的执行状态如何,finally block 都必须在逻辑流程的末尾运行。最后阻止是最佳实践。

我正在开发 Web 应用程序项目,该项目使用 JDK-1.4、纯 SQL 查询并从连接池获取数据库连接。大多数SQL语句都是嵌套语句,单个方法包含多个Statement和ResultSet对象。

在这种情况下,我对finally block 持怀疑态度,因为根据测试,finally block 没有释放资源,而是Web应用程序正在获取更多连接。最后,Tomcat 5.5 每隔两/三个小时就会被挂掉。

然后,我删除了finally block ,并在执行SQL操作后和catch block 中释放资源。之后,Web应用程序完美地释放了资源,并且tomcat不再挂起。

因此,我对finally block 的理论非常困惑。

这是代码片段,如果编码技术有误,请指出:

        ... .. . . .. . .. . . .. .. . 
........ . .. . . ... . .. . .

Connection dbCon = null;
Statement stmt1 = null;
ResultSet rs1 = null;

try {
dbCon = DB.getConnection();

stmt1 = dbCon.createStatement();
rs1 = stmt1.executeQuery("sql Query as String");

while(rs1.next()){

String col1 = rs1.getString("DB_COL_1");
int col2 = rs1.getInt("DB_COL_2");
String col3 = rs1.getString("DB_COL_3");

if(col3 != null){

Statement stmt2 = null;
ResultSet rs2 = null;

try{
stmt2 = dbCon.createStatement();
rs2 = stmt2.executeQuery("sql Query as String");

------- - ----

while(rs2.next()){
String col4 = rsTierMember.getString("DB_COL_4");

... . .. . . . .....
. .. . .. . . . . . ..
}

... . .. .. ... .

}catch(SQLException sqlExp){

} catch (Exception e) {

}finally{
try{
if(rs2!=null)
rs2.close();
if(stmt2!=null)
stmt2.close();
}catch(Exception ex){}
}
}

}

.... . .. .

}catch (SQLException e) {

} catch (Exception e) {

}finally{
try{
if(rs1!=null)
rs1.close();
if(stmt1!=null)
stmt1.close();
if(dbCon!=null)
dbCon.close;
}catch(Exception ex){

}
}


...... . . . . . ...
... . .. . .. . . .. .

最佳答案

I was wondering whether finally block is really reliable to close the resource or not; such as, database connection?

这取决于您所说的“可靠”是什么意思。

  • 如果 JVM 硬中止(例如由于 JIT 中的错误),它可能不会执行
  • 如果 JVM 正在正常终止,则可能不会执行(参见 Harmeet 的回答)
  • 它不会执行它,try block 的内容永远挂起
  • 如果计算机突然断电,它不会执行

在所有这些情况下,我希望数据库注意到连接的另一端已经消失。

如果您的架构师有一个特定场景,他们认为finally block 不会执行,他应该提供该场景的示例,此时您几乎肯定能够证明他们是错的。如果他们拒绝提供任何细节,则忽略它们,并向管理层建议他们应该开始寻找一位不那么迷信的建筑师。

In this scenario, I am skeptical about finally block because according to the test, finally block is not releasing the resource instead the web app is acquiring more connection. At end, Tomcat 5.5 is hanged every two/three hours later.

听起来测试可能无效,或者您在其他地方泄漏了连接,或者您没有关闭连接。不过验证很容易:将日志记录放在 finally block 中,以验证您期望释放资源的代码是否至少被调用。如果它被调用但没有释放连接,那么它就不再是 finally block 的问题。

关于java - finally block 关闭资源真的可靠吗?更新了代码片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12077325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com