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();
}
}
}