我想知道 finally 块是否真的可以关闭资源;比如,数据库连接?
根据我们的架构师的说法,finally 块对于关闭数据库连接是不可靠的,尤其是在 Web 应用场景中。
根据理论,无论代码的执行状态如何,finally 块都必须在逻辑流程结束时运行。finally 块是最佳实践。
我正在开发使用 JDK-1.4、纯 SQL 查询并从连接池获取数据库连接的 Web 应用程序项目。大多数 SQL 语句都是嵌套语句,单个方法包含多个 Statement 和 ResultSet 对象。
在这种情况下,我对 finally 块持怀疑态度,因为根据测试,finally 块没有释放资源,而是 Web 应用程序正在获取更多连接。最后,Tomcat 5.5 每隔两三个小时就会挂掉一次。
然后,我在执行 SQL 操作后和 catch 块中删除了 finally 块并释放资源。之后,web 应用程序完美释放资源,tomcat 不再挂起。
因此,我对 finally 块的理论感到非常困惑。
这是代码片段,如果编码技术错误,请告知:
... .. . . .. . .. . . .. .. .
........ . .. . . ... . .. . .
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){
}
}
...... . . . . . ...
... . .. . .. . . .. .