sounds right, mostly access won't close scans unless directed to. And as you point out a list of open scans is maintained. This is even more
important now that many result sets are "open across commit" by default
now, so access can't even close them at commit.

Manish Khettry (JIRA) wrote:
[ 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();
       }
   }
}



Reply via email to