MFH*_*MFH 2 java web-applications jdbc
我想知道finally块是否真的可靠关闭资源; 比如,数据库连接?
根据我们的架构师,最后块关闭数据库连接是不可靠的,尤其是在Web应用程序场景中.
根据该理论,无论代码的执行状态如何,最后块必须在逻辑流程的末尾运行.最后块是最佳实践.
我正在研究使用JDK-1.4,纯SQL查询和从连接池获取数据库连接的Web应用程序项目.大多数SQL语句都是嵌套语句,单个方法包含多个Statement和ResultSet对象.
在这种情况下,我对最终阻止持怀疑态度,因为根据测试,最后阻止不释放资源而是Web应用程序正在获取更多连接.最后,Tomcat 5.5每隔两三个小时就被吊死一次.
然后,我删除了finally块并在执行SQL操作之后和catch块中释放资源.之后,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){
}
}
...... . . . . . ...
... . .. . .. . . .. .
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 12
我想知道finally块是否真的可靠关闭资源; 比如,数据库连接?
这取决于你所说的"可靠".
try块的内容永远挂起在所有这些情况下,我希望数据库注意到连接的另一端无论如何已经消失了.
如果你的架构师有一个特定的场景,他们认为该finally块不会执行,他应该提供一个这种场景的例子,此时你几乎肯定能够证明他们是错的.如果他们拒绝提供任何细节,那么请忽略它们,并向管理层建议他们应该开始寻找一个不那么迷信的架构师.
在这种情况下,我对最终阻止持怀疑态度,因为根据测试,最后阻止不释放资源而是Web应用程序正在获取更多连接.最后,Tomcat 5.5每隔两三个小时就被吊死一次.
听起来测试可能无效,或者您在其他地方泄漏连接,或者您没有关闭连接.虽然很容易验证:在finally块中放入日志记录,以验证您希望释放资源的代码至少被调用.如果它被调用但没有释放连接,那么它不再是finally块周围的问题.
| 归档时间: |
|
| 查看次数: |
1138 次 |
| 最近记录: |