问题描述
Connectionconn=null;Resultsetrs=null;try{for(inti=0;i<100;i++){conn=getConnection();rs=stmt.executeQuery(sql);............//rs.close();//conn.close();}}catch(Exceptionex){............}finally{if(null!=rs){rs.close();rs=null;}if(null!=conn){conn.close();conn=null;}}
执行完后,不采用注释的写法,其他99个rs和conn都没有被关闭(如果循环次数大,是否会出现【结果集用尽】的问题),如何有效的关闭所有100个rs和conn?Java垃圾回收gc会自动关闭并释放那99个没有关闭的rs和conn吗(何时释放,释放前会自动执行close方法吗)?感谢!~
解决方案
本帖最后由 SimonYeung 于 2013-12-12 14:47:04 编辑
解决方案二:
。。。不能写在循环外,用一个还不够么?如果一定要写在循环内,那关闭不也应该写在循环内么?这事不能全指望垃圾回收啊。。。。
解决方案三:
引用1楼xinggg的回复:
。。。不能写在循环外,用一个还不够么?如果一定要写在循环内,那关闭不也应该写在循环内么?这事不能全指望垃圾回收啊。。。。
rs=stmt.executeQuery(sql);......//rs.close();...rs=stmt.executeQuery(sql);每次执行sql都要关闭一次?
解决方案四:
LZ试试呗,99个不行,就999个,总会因为连接数太多而出问题的。这里有一个比较深入的分析:http://www.iteye.com/problems/7232
解决方案五:
rs我印象中是每次都要关的,因为你后面根本不用了每次循环rs=stmt.executeQuery(sql);rs都是一个新对象con可以在最后关、同样,getconnection(),放到循环外
解决方案六:
把Connection的实例变成单例的
解决方案七:
因为你把getConnection()写在循环里面了,每次执行getConnection()会返回(用掉)一个可用的链接。最外面close()关闭了最后一个链接(回收)。资源的回收可以看一下GC机制,如果对象到GCroot的引用链不可达,GC就会回收(不保证)。GC回收不会调用connection的close()方法。Connection有一个状态值来指示链接是否可用,对象的销毁不依赖finallize()方法,而是close()方法(一般放在trycatch块中)。
解决方案八:
如果是同一个数据库库,就把conn写在循环外面。每次循环都用同一个conn。LZ是不是少写了statement
解决方案九:
同意5楼和7楼说法,将数据库连接写在循环外,使用单例模式,保证是有一个连接存在,可以减小连接的开销。
解决方案十:
没见过你这种写法啊··hibernate用的多都不熟悉这种写法了
解决方案十一:
现在问题不是写在里面外面我把conn写在循环里面只是当个例子一般来说conn在循环之外都用一个就好当不排除特殊情况写在里面现在的问题是其他99个对象该怎么关闭?每次实例化出来必须先rs.close()?这样写不是很麻烦吗?
解决方案十二:
rs=stmt.executeQuery(sql);......//rs.close();...rs=stmt.executeQuery(sql);使用同一个rs,每次执行stmt.executeQuery(sql);都要关闭一次前面的rs?
解决方案十三:
Connection没有closeAll()这方法,那就自己写个方法去实现吧。我想有LZ的奇思妙想能写出来哦。
解决方案十四:
new一个conn就够啦。。用完之后再关掉。