`
can_do
  • 浏览: 245758 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

采用数据库连接池连接到mysql时,因应用中没有关闭ResultSet导致的memory leak问题

阅读更多
/////////////begin///////
So it seems that even if you close all you statements and resultsets, if you do not close the connection,
it keeps references to them and the GarbageCollector can't free the resources.

My solution: after a long search I found this statement from the guys at MySQL:

"A quick test is to add "dontTrackOpenResources=true" to your JDBC URL.
If the memory leak goes away, some code path in your application isn't closing statements and result sets."
/////////////end/////////
==>是这样吗?
==>即使你关闭所有的statement和resultset,但是如果你没有关闭connection的话,connection就会引用到statement和resultset上,从而导致GC不能释放这些资源(statement和resultset)。
==>快速测试验证:如果在JDBC的url加上参数【dontTrackOpenResources=true】,memory leak消失的话,则说明应用中某些代码没有关闭statement和resultset。
==>"When the connection property dontTrackOpenResources=true was used, the result set was closed after a statement.close() was issued."
==>【小结】当采用参数【dontTrackOpenResources=true】时,在statement关闭后,resultset也会被关闭。==>从而证明,应用中有没有关闭的ResultSet对象。
==>http://bugs.mysql.com/bug.php?id=69746
==>考虑将连接池的最小空闲数配为0==>测试结果==>不可行
==>https://docs.oracle.com/cd/E17952_01/connector-j-relnotes-en/news-5-1-28.html
////////////begin/////////
When the connection property dontTrackOpenResources=true was used, the result set was closed after a Statement.close() was issued. (Bug #17164058, Bug #69746)
http://bugs.mysql.com/bug.php?id=69746
////////////end//////////

【Tip】程序中需要显式关闭ResultSet吗?

==>Note:When a Statement object is closed, its current ResultSet object, if one exists, is also closed.
==>http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html
  >>>因为:当statement对象关闭时,其所产生的或者关联的ResultSet对象,如果存在,也会被关闭的。
  >>>说明,不显式关闭ResultSet是正常的行为,但是实际开发中,还是建议用完后,立即关闭并赋为null。
==>对象间引用关系:Connection==>产生==>Statement==>产生==>ResultSet

==>A ResultSet object maintains a cursor pointing to its current row of data. Initially the cursor is positioned before the first row.
The next method moves the cursor to the next row, and because it returns false when there are no more rows in the ResultSet object,
it can be used in a while loop to iterate through the result set.
==>技术细节:ResultSet维护的是一个游标,其初始指向第一行之前,而不是指向第一行的。因为代码中,取数据需要执行next()方法的。

【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:

分享到:
评论

相关推荐

    java数据库连接ResultSet

    java数据库连接ResultSet

    JSP分页代码-数据库连接池+JavaBean+JSP+SQL Server+JDBC3.0的数据库分页技术

    public Pagi()//定义构造器,初始化每页显示的主题数和数据库的连接。 { intPageSize=4; //每页显示的记录数目 db = new DB(); } //Countsql:总记录的Query字符串。[形式为select count(*) from tablename] //...

    用java写的一个数据库连接池

    自己开发的一个数据库连接池,包含代码,在oracle测试了一下,请各位对代码指正。 使用的方法如下: 1.在工程里面加入以下jar文件:mydatasource.jar,dom4j.jar,ojdbc14.jar 2.在工程目录任意位置放入连接池配置文件...

    数据库的连接 数据库的连接

    通过本次试验,掌握了如何用JDBC去连接一个数据库,以及数据库的工作原理,还有连接过程中容易出现的异常,掌握了通过ODBC去连接JDBC方法和过程,怎样设置数据源,同时加深了对java程序面向对象编程的理解。

    JDBC连接所有数据库步骤

    1 将数据库的JDBC驱动加载到classpath中,在基于JAVAEE的WEB应用实际开发过程中,通常要把目标数据库产品的JDBC驱动复制到WEB-INF/lib下. 2 加载JDBC驱动,并将其注册到DriverManager中。 3 建立数据库连接,取得...

    Java建立数据库连接并实现数据库查询.rar

    Java建立数据库连接并实现数据库查询,初学者通过本Java源代码,了解如何加载驱动器,获取连接,定义SQL查询语句,获取Statement对象,执行查询、遍历ResultSet、获取数据、在控制台输出数据,关闭连接等。

    hikariCP 光连接池

    HikariCP-java7-2.4.10.jar 光连接池 传说光一样的速度.

    SQL2000数据库连接代码

    sql2000数据库驱动连接 Connection,sql,ResultSet

    Java JSP Servlet数据库连接代码.rar

    Java JSP Servlet数据库连接代码,把数据库连接封装在Servlet中,可多次重复调用,另外更换数据库时候也很方便修改。//连接并查询数据库  String sqlStr="select * from users"; //SQL查询语句  Statement st=...

    java连接mysql数据库 java连接sql server数据库

    在java的应用中,我们经常会对数据库进行必要的操作,下来我们就了解一下如何用java连接mysql数据库 以及java连接sql server数据库 一、mysql import java.sql.Connection; import java.sql.DriverManager; ...

    Mysql,SQL Server 2000,Oracle四种数据库的连接

    ! String trans(String chi) { String result = null; byte temp []; try { temp=chi.getBytes("iso-8859-1");... //关闭连接、释放资源 rst.close(); stmt.close(); con.close(); %> </html>

    数据库-数据库编码解决方案

    还是利用我在文章《使用JAVA动态代理实现数据库连接池》中使用的动态接口代理技术。首先我们设计Connection接口的代理类_Connection,这个代理类接管了Connection接口中所有可能获取到Statement或者...

    数据库连接,里面有各种数据库的连接方法

    DBConnectionManager.java //连接数据库用的 import java.sql.*; public class DBConnectionManager { private String driverName="com.microsoft.jdbc.sqlserver.SQLServerDriver"; private String url="jdbc:...

    通过反射从数据库返回集合ResultSet中得到实体对象的list集合

    通过反射从数据库返回集合ResultSet中得到实体对象的list集合

    数据库结果集ResultSet判断为空记录数缺少一行和没有记录但永不为空问题

    最近在做毕业设计,需要用到数据库,在用结果集ResultSet判断的时候遇到一个郁闷的事情。 一开始我的想法是这么一个框架: ResultSet rs = dao.executeQuery(sql); if(rs不为空){ while(rs.next()){ … } }else{ … ...

    学生选课系统(连接Mysql数据库).docx

    学生选课系统(连接Mysql数据库) /* JDBC连接数据库 */ package immoc4.bao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java....

    MYSQL中文手册

    10.2. MySQL中的字符集和校对 10.3. 确定默认字符集和校对 10.3.1. 服务器字符集和校对 10.3.2. 数据库字符集和校对 10.3.3. 表字符集和校对 10.3.4. 列字符集和校对 10.3.5. 字符集和校对分配示例 10.3.6. ...

    myeclipse中连接mysql数据库示例代码

    1. 环境配置 ...安装完成后,测试连接数据库。...在安装后的软件包中,mysql_server\Connector J XXXX中可以找到一个jar包,这个jar包是java程序连接mysql数据库必须的。若没有这个包,程序代码将提示:C

    Java连接数据库并修改内容.rar

    Java连接数据库并修改内容,Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动器  Connection con=DriverManager.getConnection(dbURL,user,password); //获取连接  String sqlStr="select * from ...

    jsp连接数据库代码

    jsp连接数据库代码 testmysql.jsp如下:  ;charset=gb2312"%>  *"%>  <html>  <body>  ("com.sybase.jdbc.SybDriver").newInstance();  String url =" jdbc:sybase:Tds:localhost:5007/tsdata";  //ts...

Global site tag (gtag.js) - Google Analytics