Hibernate - 从服务层中的DAO获取ScrollableResults

时间:2016-08-18 11:40:24

标签: java hibernate

在某些情况下,我需要读取数据库表的所有行以进行批处理。为了与db通信,我使用DAO。所以在服务层我可以做dao.getAll()之类的事情。为此我需要从dao返回db的每一行。如果出现“内存不足错误”,我无法返回包含所有实体的List,因为该表非常大。分页不是一个好的解决方案,因为它会导致多个数据库调用。 所以有一个名为ScrollableResults的东西,它允许我滚动所有实体并处理每一行而不会淹没内存。由于我使用DAO,我必须将每行从DAO返回到服务层。我怎样才能做到这一点?还有其他解决方案可以解决这个问题吗?我正在使用Hibernate和嵌入式Derby数据库。

1 个答案:

答案 0 :(得分:0)

这可以使用Query接口和Criteria来完成..

Query query = session.createQuery(query);
query.setReadOnly(true);
query.setFetchSize(Integer.MIN_VALUE);
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
// iterate over results
while (results.next()) {
    Object row = results.get();
    // process row then release reference
    // you may need to evict() as well
}
results.close();

这里Hibernate仍然会在Session中缓存结果,所以你需要经常调用session.evict()或session.clear()。

当不需要缓存时,最好使用StatelessSession。

ScrollableResults results = session.createQuery(query) .setReadOnly(true).setFetchSize( 1000 ).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY)