commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Phil Steitz (JIRA)" <>
Subject [jira] Commented: (DBCP-330) Calling getMetaData() without closing the connection lead to a memory leak
Date Wed, 14 Apr 2010 11:28:51 GMT


Phil Steitz commented on DBCP-330:

Thanks for reporting this.  It looks to me like there is no need for DelegatingDatabaseMetaData
to extend AbandonedTrace.  The methods that open resultsets wire them to the underlying connection
themselves - i.e., there is no need to insert the DelegatingDatabaseMetaData itself into the
associated connection's trace.  So as a fix, I propose:

1) Add a comment indicating that in 2.0, this class will no longer extend AbandonedTrace
2) In the constructor, replace super(c) with super()

> Calling getMetaData() without closing the connection lead to a memory leak
> --------------------------------------------------------------------------
>                 Key: DBCP-330
>                 URL:
>             Project: Commons Dbcp
>          Issue Type: Bug
>    Affects Versions: 1.4
>         Environment: Linux Mint 8 Helena - Universal Edition
> Linux version 2.6.31-14-generic (buildd@rothera) (gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8)
) #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009
> java version "1.6.0_15"
> Java(TM) SE Runtime Environment (build 1.6.0_15-b03)
> Java HotSpot(TM) Client VM (build 14.1-b02, mixed mode, sharing)
>            Reporter: Tim
>            Priority: Minor
> In my program, I am using a BasicDataSource to get my database connections. I have to
keep one of the connection alive and thus never close it. On this connection, I have to periodically
get the metadata (call the getMetaData() method) for my processing.
> However, I have noticed that each call to this method create a new DelegatingDatabaseMetaData
instance which can't be garbage collected until the connection is closed. This creation of
DelegatingDatabaseMetaData will finally consume all the memory and generate a OutOfMemory
> Actually, in it's constructor, the DelegatingDatabaseMetaData class calls its super constructor
(from the AbandonedTrace class) which creates a reference (parent.addTrace(this);) from the
connection to the DelegatingDatabaseMetaData. This reference prevent the DelegatingDatabaseMetaData
to be collected until the Connection is closed.

This message is automatically generated by JIRA.
If you think it was sent incorrectly contact one of the administrators:
For more information on JIRA, see:


View raw message