Hibernate - 从服务层的DAO获取ScrollableResults
问题描述:
在某些情况下,我需要读取批处理的数据库表的所有行。为了与db沟通我使用DAO。所以在服务层上,我可以做类似dao.getAll()
的事情。为此,我需要从dao返回每行数据库。如果出现“内存不足错误”,我无法返回包含所有实体的List
,因为表格非常大。分页不是一个好的解决方案,因为它会导致多个数据库调用。 所以有一个叫做的东西,它允许我滚动浏览所有实体并处理每一行而不会溢出内存。由于我使用DAO,我必须将每行从DAO返回到服务层。我怎样才能做到这一点?是否有其他解决方案来解决这个问题?我正在使用嵌入式Derby数据库的Hibernate。Hibernate - 从服务层的DAO获取ScrollableResults
答
这可以通过查询接口和标准,以及完成..
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.evict()或会话。清楚()每隔一段时间。
当不需要缓存时,最好使用StatelessSession。
ScrollableResults results = session.createQuery(query) .setReadOnly(true).setFetchSize(1000).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY)
好吧,但这样做,我会在处理结果时在我的DAO中拥有业务逻辑。这就是我想要避免的。我以为我可以在DAO之外得到结果,并在另一个课程中处理它们。那可能吗? – Joey