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

问题描述

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就够啦。。用完之后再关掉。

时间: 2024-11-08 18:11:50

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

简析Android的垃圾回收与内存泄露

Android系统是运行在Java虚拟机上的,作为嵌入式设备,内存往往非常有限,了解Android的垃圾回收机制,可以有效的防止内存泄露问题或者OOM问题.本文作为入门文章,将浅显的讨论垃圾回收与内存泄露的原理,不讨论Dalvik虚拟机底层机制或者native层面的问题. 1. 基础 在分析垃圾回收前,我们要复习Java与离散数学的基础. 实例化:对象是类的一个实例,创建对象的过程也叫类的实例化.对象是以类为模板来创建的.比如Car car = new Car();,我们就创造了一个Car的实例

Android webview 内存泄露的解决方法

Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递getApplicationContext. 1.避免在xml直接写webview控件,这样会引用activity,所以在xml写一个LinearLayout,然后 linearLayout.addView(new MyWebview(getApplicati

用java创建一个内存泄露的步骤?

问题: 我之前参加了一个面试, 被问到在java中如何创建一个内存泄露.不用说我当时不知道说啥,如何创建一个,我到现在也没有头绪.可以给我示范一个例子么? 回答: 有一个方式可以创建一个纯Java的内存泄露(运行代码中对象不可达,但仍然驻留在内存里) 1. 应用创建了一个长时间运行的线程(或者使用线程池,这会使内存泄露更快)2.线程从类加载器加载一个类3. 这个类分配一个大内存块(例如new byte[1000000]) ,把它通过强引用指向一个静态成员变量,然后把它自己的引用存储到Thread

JavaScript中的内存泄露模式:在JavaScript应用程序中处理循环引用

如果您知道内存泄漏的起因,那么在 JavaScript 中进行相应的防范就应该相当容易.在这篇文章中,作者 Kiran Sundar 和 Abhijeet Bhattacharya 将带您亲历 JavaScript 中的循环引用的全部基本知识,向您介绍为何它们会在某些浏览器中产生问题,尤其是在结合了闭包的情况下.在了解了您应该引起注意的常见内存泄漏模式之后,您还将学到应对这些泄漏的诸多方法. JavaScript 是用来向 Web 页面添加动态内容的一种功能强大的脚本语言.它尤其特别有助于一些日

关于闭包和循环加触发事件 产生内存泄露问题

问题描述 我的代码是这样写的......        ddlstart_f.onblur=function(y1){return function(){checkNum(1,y1);}}(i);......据说这样写会产生内存泄露问题,当页面关闭时.这部分内存会被释放吗.ddlstart_f控件是在table中动态生成的.如果这部分内存不会被释放,我在onunload事件中把整个table删除掉可不可以.请赐教. 解决方案 浏览器关了内存肯定被释放了

java造成内存泄露原因

一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的.GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请.引用.被引用.赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题.在J

聊聊内存泄露

一.Java内存回收机制  不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的.GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请.引用.被引用.赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题.在

详细介绍Java内存泄露原因_java

一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的.GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请.引用.被引用.赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收,这样也可以消除引用循环的问题.在J

Python中由于logging模块误用导致的内存泄露的解决方法

  Python中由于logging模块误用导致的内存泄露的解决方法         这篇文章主要介绍了解决Python中由于logging模块误用导致的内存泄露,针对由于过多的UDP连接所产生的问题,需要的朋友可以参考下 首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging 模块用的不对 我们之前有这么一个需求, 就是针对每一个连接日志输出当前连接