我从表中获取行以将行写入csv文件,但此表包含超过500,000行,因此在获取数据时会抛出“堆内存不足”异常。如何处理?
答案 0 :(得分:1)
使用query.scroll()
代替query.list()
来获取查询结果。这样可以避免将整个结果集加载到内存中。
答案 1 :(得分:1)
您可以尝试对查询进行分页,以批量获取和处理数据:
// Would 1000 records per batch be optimal?
final int pageSize = 1000;
int pageNumber = 1;
boolean done = false;
Criteria criteria = session.createCriteria(MyEntity.class);
while (! done) {
criteria.setFirstResult((pageNumber - 1) * pageSize);
criteria.setMaxResults(pageSize);
List<MyEntity> ents = (List<MyEntity>) criteria.list();
if (ents != null) {
for (MyEntity e : ents) {
// Process the entity.
}
// Maybe check for ending like this?
// done = ents.size() < pageSize;
pageNumber++;
}
else {
// No more data.
done = true;
}
}
<强>更新强>
This article从2008年开始,但它讨论了您的问题。有人说速度慢来自Oracle服务器。他们还讨论了query.scroll()
。
您应该检查this article以及Oracle中的这两个:top-N queries和ROWNUM limiting。
<强>更新强>
刚刚找到这个article on processing huge files。它不是用于数据库处理,但它可能在将来有用。