[ http://issues.apache.org/jira/browse/DERBY-210?page=all ]
Deepa Remesh updated DERBY-210:
-------------------------------
Attachment: derby-210-patch1.diff
derby-210-patch1.status
I have attached a partial patch 'derby-210-patch1.diff' for this problem. It
does not solve the entire memory leak problem.
PreparedStatement references are stored by client driver at following places:
1. In org.apache.derby.client.am.Connection, they are added to
java.util.LinkedList 'openStatements_'
2. In org.apache.derby.client.am.Connection, they are added to
java.util.LinkedList 'CommitAndRollbackListeners_'
This patch eliminates the above references by using WeakHashMap instead of
LinkedList. When there are no other references to the keys in a WeakHashMap,
they will get removed from the map and can thus get garbage-collected. They do
not have to wait till the Connection object is collected.
I removed the list RollbackOnlyListeners_ since this is not being used.
I have also updated the following comment for openStatements_:
// Since DERBY prepared statements must be re-prepared after a commit,
// then we must traverse this list after a commit and notify statements
// that they are now in an un-prepared state.
final java.util.LinkedList openStatements_ = new java.util.LinkedList();
In the code, I did not see this list being traversed after a commit to
re-prepare statements. Also, I think this is not needed since Derby does not
require re-prepare of statements after a commit. Currently, this list is used
to close all open statements when the originating connection is closed.
With this patch, I ran derbyall successfully with Sun JDK 1.4.2 on Windows XP.
I'd appreciate if someone can review this patch and provide me feedback.
> Network Server will leak prepared statements if not explicitly closed by the
> user until the connection is closed
> ----------------------------------------------------------------------------------------------------------------
>
> Key: DERBY-210
> URL: http://issues.apache.org/jira/browse/DERBY-210
> Project: Derby
> Type: Bug
> Components: Network Client
> Reporter: Kathey Marsden
> Assignee: Deepa Remesh
> Attachments: derby-210-patch1.diff, derby-210-patch1.status, derbyStress.java
>
> Network server will not garbage collect prepared statements that are not
> explicitly closed by the user. So a loop like this will leak.
> ...
> PreparedStatement ps;
> for (int i = 0 ; i < numPs; i++)
> {
> ps = conn.prepareStatement(selTabSql);
> rs =ps.executeQuery();
> while (rs.next())
> {
> rs.getString(1);
> }
> rs.close();
> // I'm a sloppy java programmer
> //ps.close();
> }
>
> To reproduce run the attached program
> java derbyStress
> Both client and server will grow until the connection is closed.
>
> It is likely that the fix for this will have to be in the client. The client
> does not send protocol to close the prepared statement, but rather reuses the
> PKGNAMCSN on the PRPSQLSTT request once the prepared statement has been
> closed. This is how the server knows to close the old statement and create a
> new one.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira