Index: java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/derbyStress.java =================================================================== --- java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/derbyStress.java (revision 611209) +++ java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/derbyStress.java (working copy) @@ -54,7 +54,7 @@ } reExecuteStatementTest(); - + testDerby3316(); System.out.println("Test derbyStress finished."); } catch (SQLException se) { TestUtil.dumpSQLExceptions(se); @@ -133,4 +133,34 @@ conn.close(); System.out.println("PASSED"); } + + /** + * Test fix for leak if ResultSets are not closed. + * @throws Exception + */ + public static void testDerby3316() throws Exception { + System.out.println("DERBY-3316: Multiple statement executions "); + Connection conn = ij.startJBMS(); + + Statement s = conn.createStatement(); + s.executeUpdate("CREATE TABLE TAB (col1 varchar(32672))"); + PreparedStatement ps = conn.prepareStatement("INSERT INTO TAB VALUES(?)"); + ps.setString(1,"hello"); + ps.executeUpdate(); + ps.setString(1,"hello"); + ps.executeUpdate(); + ps.close(); + for (int i = 0; i < 2000; i++) + { + s = conn.createStatement(); + ResultSet rs = s.executeQuery("SELECT * from tab"); + // drain the resultset + while (rs.next()); + // With DERBY-3316, If I don't explicitly close the resultset or + // statement, we get a leak. + //rs.close(); + //s.close(); + } + } + } Index: java/testing/org/apache/derbyTesting/functionTests/master/derbyStress.out =================================================================== --- java/testing/org/apache/derbyTesting/functionTests/master/derbyStress.out (revision 611913) +++ java/testing/org/apache/derbyTesting/functionTests/master/derbyStress.out (working copy) @@ -2,4 +2,5 @@ Testing with 2000 prepared statements PASS -- Prepared statement test DERBY-557: reExecuteStatementTest() PASSED -Test derbyStress finished. \ No newline at end of file +DERBY-3316: Multiple statement executions +Test derbyStress finished. Index: java/client/org/apache/derby/client/am/SectionManager.java =================================================================== --- java/client/org/apache/derby/client/am/SectionManager.java (revision 611209) +++ java/client/org/apache/derby/client/am/SectionManager.java (working copy) @@ -21,6 +21,8 @@ package org.apache.derby.client.am; +import java.lang.ref.WeakReference; + import org.apache.derby.shared.common.reference.JDBC30Translation; import org.apache.derby.shared.common.reference.SQLState; @@ -184,11 +186,12 @@ } void mapCursorNameToResultSet(String cursorName, ResultSet resultSet) { - positionedUpdateCursorNameToResultSet_.put(cursorName, resultSet); + // Needs + positionedUpdateCursorNameToResultSet_.put(cursorName, new WeakReference(resultSet)); } ResultSet getPositionedUpdateResultSet(String cursorName) throws SqlException { - ResultSet rs = (ResultSet) positionedUpdateCursorNameToResultSet_.get(cursorName); + ResultSet rs = (ResultSet) ((WeakReference) (positionedUpdateCursorNameToResultSet_.get(cursorName))).get(); if (rs == null) { throw new SqlException(agent_.logWriter_, new ClientMessageId(SQLState.CLIENT_RESULT_SET_NOT_OPEN));