`
can_do
  • 浏览: 264608 次
  • 性别: 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连接mysql数据库连接池demo

    4. **数据库连接配置**: 连接MySQL数据库时,需要提供以下信息: - 数据库URL:通常格式为`jdbc:mysql://hostname:port/databaseName`,其中hostname是数据库服务器地址,port是MySQL服务端口(默认3306),...

    数据库连接池eclipse+MySQL

    数据库连接池是现代Java应用程序中管理数据库连接的关键技术,它能显著提高应用性能并优化资源利用率。在本示例中,我们将关注如何在Eclipse集成开发环境中配置和使用数据库连接池来连接MySQL数据库,主要涉及JDBC...

    数据库连接池代码实现

    2. **连接获取与释放**:当应用需要进行数据库操作时,它会从连接池中获取一个可用的连接,执行完操作后,必须将其归还到连接池中,以便其他线程再次使用。 3. **连接管理**:连接池需要维护连接的状态,包括检查...

    dbcp数据库连接池

    数据库连接池的基本原理是预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕后归还,而不是每次操作都创建新的连接。 **连接池的重要性**: 1. **资源复用**:通过重用已建立的...

    数据库连接池问题.doc

    数据库连接池在初始化时会创建一定数量的数据库连接并存储起来,这些连接在应用程序需要时可以从池中获取,用完后归还到池中,而不是直接关闭。这种预先准备好的连接池可以显著减少数据库连接的创建和销毁次数,...

    HikariCP数据库连接池实战.docx

    在使用 HikariCP 之前,我们需要先创建数据库连接,并将连接加入到连接池中。例如,以下代码演示了如何获取连接并执行查询: HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.get...

    数据库连接池代码

    2. 连接请求与分配:当应用需要执行数据库操作时,从连接池中获取一个可用连接,如果池中无空闲连接,可能会等待或新建连接。 3. 连接回收:操作完成后,应用需将连接返回给连接池,以便其他任务重用。 4. 连接管理...

    数据库连接池在web开发中的应用

    DBCP是Apache Commons的一个组件,主要负责管理数据库连接,避免每次请求数据库时创建新的连接,从而降低系统资源消耗。在高并发环境下,频繁的数据库连接创建和关闭会消耗大量时间和资源,而连接池可以预先创建并...

    在MyEclipse中使用Weblogic数据库连接池技术

    ### 在MyEclipse中使用Weblogic数据库连接池技术 #### 一、概述 本文将详细介绍如何在MyEclipse环境中配置并使用Weblogic数据库连接池技术。...希望本文能帮助您更好地理解和应用数据库连接池技术。

    DBCP配置数据库连接池

    数据库连接池在应用服务器启动时创建一定数量的数据库连接,并将这些连接放入池中,当应用程序需要访问数据库时,可以从连接池中获取一个连接,使用完毕后归还给连接池,而不是直接关闭,这样可以有效地减少数据库...

    SQL Server数据库连接池及jdbc调用

    当应用程序需要与数据库交互时,它不会直接创建新的连接,而是从连接池中获取一个已存在的连接,使用完毕后归还给池而不是关闭连接。这样可以避免频繁地创建和销毁连接,减少了系统开销,提高了资源利用率。 SQL ...

    数据库连接池的实现java

    数据库连接池在初始化时会创建一定数量的数据库连接,这些连接在空闲时会被池管理器保存起来,当应用程序需要与数据库交互时,可以从连接池中获取一个已存在的连接,而不是每次都新建一个。使用完毕后,应用将连接...

    tomcat数据库连接池配置

    在Java Web开发中,Tomcat作为一款广泛使用的应用服务器,其数据库连接池配置是十分重要的一个环节。合理的配置能够显著提高应用程序的性能和稳定性。本文将以MySQL数据库为例,详细介绍如何在Tomcat中配置数据库...

    java apache 数据库连接池 天涯浪子

    当应用程序需要连接数据库时,它会从池中借用一个连接,使用完毕后归还,而不是每次操作都新建和关闭连接。这避免了频繁的创建和销毁连接的开销。 2. **Apache DBCP**:Apache的DBCP是一个实现了JDBC规范的数据源...

    JSP 数据库连接池的配置

    在JSP(JavaServer Pages)开发中,数据库连接池的配置是一项非常重要的技术,它能够显著提高应用程序的性能和响应速度。本文将详细介绍如何在JSP项目中配置MySQL数据库连接池。 #### 一、准备环境与所需文件 1. *...

    使用JAVA中的动态代理实现数据库连接池.rar_数据库连接池_连接池

    在Java编程中,数据库连接池是一种管理数据库连接的机制,它允许程序在多个请求之间复用已打开的数据库连接,而不是每次请求时都创建新的连接。这样可以显著提高应用程序的性能,减少系统资源的消耗,并提供更可靠的...

    JAVA 开发数据库连接池jar包

    连接池的基本原理是预先创建一定数量的数据库连接,并存储在一个池中,当应用程序需要时,可以从池中获取连接,使用完毕后再归还,而不是每次操作数据库都创建新的连接。这种方式减少了频繁创建和关闭连接的开销,...

    在Eclipse中使用JBoss数据库连接池技术

    数据库连接池技术允许应用程序重复使用已经建立的数据库连接,而不是每次需要时都创建新的连接,从而减少了数据库连接的创建和关闭带来的开销,提高了系统的响应速度。在本场景中,我们将使用JBoss 5.0作为应用...

    数据库 连接池

    2. **获取连接**:当应用程序需要访问数据库时,会首先从连接池中获取一个空闲的数据库连接。如果连接池中没有可用的连接,则应用程序可能会等待直到有连接可用,或者抛出异常。 3. **使用连接**:应用程序使用获取...

    C3P0数据库连接池

    1. **数据库连接池**:数据库连接池在初始化时会创建一定数量的数据库连接,当应用程序需要访问数据库时,可以从连接池中获取一个已建立的连接,使用完毕后不关闭连接,而是归还到连接池,从而避免了频繁地创建和...

Global site tag (gtag.js) - Google Analytics