【发布时间】:2017-10-31 09:42:05
【问题描述】:
我必须在 HSQLDB 数据库上使用 JDBC 遍历包含 100+ 百万条记录的表,但我无法在合理的时间内完成。我用的是 hsqldb v2.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:
ResultSet result = selectStatement.executeQuery();
while (result.next()) {
Long id = result.getLong(1);
// do stuff ...
}
HSQLDB 仍然尝试获取表的所有行并且返回的ResultSet不适合内存。这是堆栈跟踪:
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 中实现这一点?
【问题讨论】:
-
如何循环访问
ResultSet? -
我使用常规的 while 循环:
while (result.next()) ... -
你的 HSQLDB 版本是多少?
-
我想知道你循环的内容。您如何处理每条记录。
-
我使用的是 hsqldb v2.4.0(最新版本)。
标签: java jdbc prepared-statement hsqldb