日期:2014-05-18  浏览次数:20789 次

断开连接时的线程安全问题

try{
conn=ds.getConnection();
stmt=conn.createstatement();
rs=stmt.executeQuery("");
......

rs.close();//-----------------1
rs=null;
stmt.close();
stmt=null;
conn.close();
conn=null;//------------------1
}
catch(Exception e){
....}
finally{//--------------------2
if(rs!=null){
try{
rs.close();}
catch(Exception e){...}
rs=null;
 }
if(stmt!=null){
try{
stmt.close();}
catch(Exception e){...}
stmt=null;
 }
if(conn!=null){
try{
conn.close();}
catch(Exception e){...}
conn=null;
 }---------------------------2
}


困惑:
我怎么觉得1处的三个close是多余的,反正finally总是执行的,为什么不单留下finally里的处理。
在1处处理一下的目的是神马?
线程安全

------解决方案--------------------
太多鱼了吧。。没必要的
------解决方案--------------------
貌似try中的close是多余的
------解决方案--------------------
说明你看的那书也不咋地。。。
------解决方案--------------------
如果finally反正都要执行的话,try里头的close完全可以不用啊
------解决方案--------------------
同意,确实多余
------解决方案--------------------
还在入门阶段,加油吧
------解决方案--------------------
引用:
引用:貌似try中的close是多余的你的意思是说直接赋值null,然后就被自动回收了?

没,我是说整个
rs.close();//-----------------1
rs=null;
stmt.close();
stmt=null;
conn.close();
conn=null;//------------------1
部分是多余的

因为与finally中重复了

但如果说用=null代替close方法,还要研究一下,close方法关闭的资源可能不止它自身对象