使用Hibernate从Oracle DB中获取500K +行

时间:2014-03-10 07:12:31

标签: java oracle hibernate

我从表中获取行以将行写入csv文件,但此表包含超过500,000行,因此在获取数据时会抛出“堆内存不足”异常。如何处理?

2 个答案:

答案 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 queriesROWNUM limiting

<强>更新

刚刚找到这个article on processing huge files。它不是用于数据库处理,但它可能在将来有用。