[ http://issues.apache.org/jira/browse/DERBY-210?page=comments#action_12366967 ]
Kathey Marsden commented on DERBY-210: -------------------------------------- I am rephrasing this comment. I mispoke about the risidual statements not getting cleaned up. That is and will remain a problem because there is no CLSSTMT in DRDA. But this is what I meant to say about the result sets I think there actually is a problem with not sending CLSQRY for finalize. If I have 20,000 open valid and referenced prepared statements and then I dereference them. Their result sets will not get cleaned up until the connection ends because no CLSQRY will be sent. The reason for the change was to take the autocommit out of finalize and with that I fully agree, but I wonder: why do we have to take out the CLSQRY? writeCloseResultSets takes a boolean allowAutocommits. Could we continue to call it for finalize but just with that parameter set to false? Also I would appreciate input from others on this. > 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: DOTS_ATCJ2_Derby-noPatch.png, DOTS_ATCJ2_Derby-withPatch.png, > derby-210-patch1.diff, derby-210-patch2.diff, derby-210-patch2.status, > derby-210-patch3.diff, derby-210-patch4-v2.diff, derby-210-patch4-v2.status, > derby-210-v2-draft.diff, derby-210-v2-draft.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
