[ http://issues.apache.org/jira/browse/DERBY-756?page=comments#action_12362606 ]
Manish Khettry commented on DERBY-756: -------------------------------------- It looks like the scan controller created in DistinctScalarAggregateResultSet is never closed. This causes the scanController instance variable in RAMTransaction to continue to grow with each open/close. Shouldn't DistinctScalarAggregateRS implement a close or a finish method (not sure what the difference is) and close the scan controller there. > OutOfMemory Error on continous execution of select statement using COUNT() > and DISTINCT on same connection > ---------------------------------------------------------------------------------------------------------- > > Key: DERBY-756 > URL: http://issues.apache.org/jira/browse/DERBY-756 > Project: Derby > Type: Bug > Components: Demos/Scripts, JDBC, Network Client, Network Server, SQL > Versions: 10.0.2.1, 10.1.2.1 > Environment: Windows XP, Java 1.5.0_05, Derby network server 10.0.2.1, > 10.1.2.1, Derby heapsize 128m, IBM Universal JDBC driver > Reporter: Bill Chen > Assignee: Manish Khettry > Priority: Critical > > The OutOfMemory is thrown when I continously execute a sql statement on an > openned JDBC connection. A PreparedStatement and ResultSet is created on the > connection everytime and close after each execution. I suspect that the bug > is related to function COUNT() with keyword DISTINCT. For example, "select > count(distinct ID) from TEST where FLAG <> 2". It will be fine if DISTINCT is > not used, or select count(*) is used. > The exception like "Exception in thread "DRDAConnThread_2" > java.lang.OutOfMemoryError: Java heap space" could be thrown on Derby side, > or sometimes on client side. > Please find the test code and schema I used for testing: > create table: > CREATE TABLE Test > ( > ID BIGINT NOT NULL, > NAME VARCHAR(512) NOT NULL, > FLAG int, > CONSTRAINT PK_ID PRIMARY KEY (ID) > ); > insert data: > insert into TEST values (0, 'name0', 0); > insert into TEST values (1, 'name1', 1); > insert into TEST values (2, 'name2', 2); > Java client: > import java.sql.Connection; > import java.sql.PreparedStatement; > import java.sql.ResultSet; > import java.sql.DriverManager; > import java.sql.SQLException; > public class DerbyTest > { > static public void main(String args[]) throws Exception > { > Class.forName("com.ibm.db2.jcc.DB2Driver"); > Connection conn = null; > try > { > conn = > DriverManager.getConnection("jdbc:derby:net://localhost:1527/testDB", > "admin", "admin"); > for (int i = 0; i < 10000000; i++) > { > System.out.println("Query "+i); > String sql = "select count(distinct ID) from TEST where FLAG > <> 2"; > PreparedStatement pStmt = null; > ResultSet rs = null; > try > { > pStmt = conn.prepareStatement(sql); > rs = pStmt.executeQuery(); > if (rs.next()) > { > rs.getInt(1); > } > } > catch (SQLException e) > { > e.printStackTrace(); > } > finally > { > if (rs != null) > rs.close(); > if (pStmt != null) > pStmt.close(); > } > } > } > finally > { > if (conn != null) > conn.close(); > } > } > } -- 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