Java 选择100+;HSQLDB中有数百万行

Java 选择100+;HSQLDB中有数百万行,java,jdbc,prepared-statement,hsqldb,Java,Jdbc,Prepared Statement,Hsqldb,我必须使用JDBC在HSQLDB数据库上迭代一个包含1亿多条记录的表,但我无法在合理的时间内完成。我使用HSQLDB2.4.0 我尝试将PreparedStatement与以下查询一起使用来切片数据: String select = "SELECT ID, NAME, VALUE FROM MY_TABLE ORDER BY ID OFFSET ? ROWS FETCH ? ROWS ONLY"; 问题是,当我们浏览表格时,它需要越来越多的时间。请注意,ID列已编制索引 我试图设置提取大小,但

我必须使用JDBC在HSQLDB数据库上迭代一个包含1亿多条记录的表,但我无法在合理的时间内完成。我使用HSQLDB2.4.0

我尝试将
PreparedStatement
与以下查询一起使用来切片数据:

String select = "SELECT ID, NAME, VALUE FROM MY_TABLE ORDER BY ID OFFSET ? ROWS FETCH ? ROWS ONLY";
问题是,当我们浏览表格时,它需要越来越多的时间。请注意,
ID
列已编制索引

我试图设置提取大小,但也不起作用:

String select = "SELECT ID, NAME, VALUE FROM MY_TABLE";
PreparedStatement selectStatement = connection.prepareStatement(select, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
selectStatement.setFetchSize(5000);
然后我遍历
结果集

ResultSet result = selectStatement.executeQuery();
while (result.next()) {
    Long id = result.getLong(1);
    // do stuff ...
} 
HSQLDB仍然尝试获取表中的所有行,并且返回的
ResultSet
不适合内存。以下是stacktrace:

java.lang.OutOfMemoryError: Java heap space
at org.hsqldb.navigator.RowSetNavigatorData.ensureCapacity(Unknown Source)
at org.hsqldb.navigator.RowSetNavigatorData.add(Unknown Source)
at org.hsqldb.QuerySpecification.buildResult(Unknown Source)
at org.hsqldb.QuerySpecification.getSingleResult(Unknown Source)
at org.hsqldb.QuerySpecification.getResult(Unknown Source)
at org.hsqldb.StatementQuery.getResult(Unknown Source)
at org.hsqldb.StatementDMQL.execute(Unknown Source)
at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeQuery(Unknown Source)
at com.jolbox.bonecp.PreparedStatementHandle.executeQuery(PreparedStatementHandle.java:174)
at myclass at the line ResultSet result = selectStatement.executeQuery();

有没有办法在HSQLDB中实现这一点?

这个问题与内存使用无关,因为这种类型的SELECT不会使用太多内存

预计选择结果的时间会增加。SELECT中的OFFSET子句指示跳过多少行。当它变大时,会选择并跳过更多的行

您需要将选择修改为:

SELECT ID, NAME, VALUE FROM MY_TABLE WHERE ID > ? ORDER BY ID FETCH ? ROWS ONLY
您可以这样处理结果,使用一个正在运行的lastID和一个PreparedStatement

long lastID = -1;

// repeat the rest of the code until the result is empty
selectStatement.setLong(1, lastID);
selectStatement.setInt(2, 100000);

ResultSet result = selectStatement.executeQuery();
while (result.next()) {
 Long id = result.getLong(1);
 lastID = id;
 // do stuff ...
}

而且

这个问题与内存使用无关,因为这种类型的SELECT不会使用太多内存

预计选择结果的时间会增加。SELECT中的OFFSET子句指示跳过多少行。当它变大时,会选择并跳过更多的行

您需要将选择修改为:

SELECT ID, NAME, VALUE FROM MY_TABLE WHERE ID > ? ORDER BY ID FETCH ? ROWS ONLY
您可以这样处理结果,使用一个正在运行的lastID和一个PreparedStatement

long lastID = -1;

// repeat the rest of the code until the result is empty
selectStatement.setLong(1, lastID);
selectStatement.setInt(2, 100000);

ResultSet result = selectStatement.executeQuery();
while (result.next()) {
 Long id = result.getLong(1);
 lastID = id;
 // do stuff ...
}

如何循环通过
结果集
?我使用常规的while循环:
while(result.next())…
您的HSQLDB版本是什么?我想知道循环的内容。如何处理每条记录。我使用hsqldb v2.4.0(最新版本)。如何循环通过
ResultSet
?我使用常规while循环:
while(result.next())…
你的hsqldb版本是什么?我想知道循环的内容。如何处理每条记录。我使用hsqldb v2.4.0(最新版本)。感谢您的回答,程序正在运行,速度很快(4分钟处理1000万行)。感谢您的回答,程序正在运行,速度很快(4分钟处理1000万行)。