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
    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

Reply via email to