【内存泄露】循环多次创建ResultSet,Connection后,如何全部关闭疑问???

SimonYeung 2013-12-12 02:33:46

Connection conn = null;
Resultset rs = null;
try{
for(int i = 0; i < 100; i++) {
conn = getConnection();
rs = stmt.executeQuery(sql);
......
......
//rs.close();
//conn.close();
}
} catch(Exception ex) {
......
......
} 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方法吗)?

感谢!~
...全文
723 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
长笛党希望 2013-12-17
  • 打赏
  • 举报
回复
new 一个 conn 就够啦。。用完之后再关掉。
闲鱼野鹤-PJY 2013-12-17
  • 打赏
  • 举报
回复
Connection没有closeAll()这方法,那就自己写个方法去实现吧。我想有LZ的奇思妙想能写出来哦。
SimonYeung 2013-12-17
  • 打赏
  • 举报
回复
rs = stmt.executeQuery(sql); ... ... //rs.close(); ... rs = stmt.executeQuery(sql); 使用同一个rs,每次执行stmt.executeQuery(sql); 都要关闭一次前面的rs?
SimonYeung 2013-12-17
  • 打赏
  • 举报
回复
现在问题不是写在里面外面 我把conn写在循环里面只是当个例子 一般来说conn在循环之外都用一个就好 当不排除特殊情况写在里面 现在的问题是 其他99个对象 该怎么关闭?每次实例化出来 必须先rs.close()? 这样写不是很麻烦吗?
放纵的青春 2013-12-16
  • 打赏
  • 举报
回复
没见过你这种写法啊·· hibernate用的多 都不熟悉这种写法了
姜小白- 2013-12-13
  • 打赏
  • 举报
回复
同意5楼和7楼说法,将数据库连接写在循环外,使用单例模式,保证是有一个连接存在,可以减小连接的开销。
miracleliu 2013-12-13
  • 打赏
  • 举报
回复
如果是同一个数据库库,就把conn写在循环外面。 每次循环都用同一个conn。 LZ是不是少写了statement
momoaiyanzi 2013-12-13
  • 打赏
  • 举报
回复
因为你把getConnection()写在循环里面了,每次执行getConnection()会返回(用掉)一个可用的链接。最外面close()关闭了最后一个链接(回收)。 资源的回收可以看一下GC机制,如果对象到GC root的引用链不可达,GC就会回收(不保证)。GC回收不会调用connection 的close()方法。Connection 有一个状态值来指示链接是否可用,对象的销毁不依赖 finallize()方法,而是close()方法(一般放在try catch块中)。
学到了吗 2013-12-12
  • 打赏
  • 举报
回复
把Connection的实例变成单例的
搬运工木木 2013-12-12
  • 打赏
  • 举报
回复
rs我印象中是每次都要关的,因为你后面根本不用了 每次循环 rs = stmt.executeQuery(sql); rs都是一个新对象 con可以在最后关、 同样,getconnection(),放到循环外
oh_Maxy 2013-12-12
  • 打赏
  • 举报
回复
LZ试试呗,99个不行,就999个,总会因为连接数太多而出问题的。 这里有一个比较深入的分析:http://www.iteye.com/problems/7232
SimonYeung 2013-12-12
  • 打赏
  • 举报
回复
引用 1 楼 xinggg 的回复:
。。。不能写在循环外,用一个还不够么? 如果一定要写在循环内,那关闭不也应该写在循环内么? 这事不能全指望垃圾回收啊。。。。
rs = stmt.executeQuery(sql); ... ... //rs.close(); ... rs = stmt.executeQuery(sql); 每次执行sql 都要关闭一次?
搬运工木木 2013-12-12
  • 打赏
  • 举报
回复
。。。不能写在循环外,用一个还不够么? 如果一定要写在循环内,那关闭不也应该写在循环内么? 这事不能全指望垃圾回收啊。。。。
内容概要:本文提出了一种面向通信优化的微电网分布式二次电压频率调控与功率均分方法,并通过Simulink平台进行了仿真实现。该方法针对孤岛微电网中多分布式电源的协同控制问题,采用分布式控制架构以减少对中央控制器的依赖,提升系统的可靠性与可扩展性。通过引入高效的通信机制与事件触发策略,在确保电压和频率快速精确恢复的同时,实现了各电源间有功与无功功率的均衡分配。文章详细阐述了控制算法的设计原理、稳定性分析过程以及关键参数的整定方法,并依托Simulink搭建完整的仿真模型,验证了所提方法在动态响应性能、抗干扰能力及通信资源利用率方面的优越性。; 适合人群:具备一定电力系统基础知识和仿真能力的研究生、科研人员及从事微电网、分布式能源系统相关工作的工程技术人员。; 使用场景及目标:①用于研究微电网中分布式电源的协调控制策略;②适用于需要实现电压频率恢复与负载功率均分的实际微电网系统设计;③为应对通信资源受限场景下的控制优化提供解决方案;④作为教学案例帮助理解分布式控制与二次调控机制。; 阅读建议:建议结合Simulink仿真模型同步学习,重点关注控制结构设计与参数整定部分,同时可延伸阅读文中提及的事件触发机制与弹性协同控制相关内容以加深理解。

67,535

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧