有没有办法将流数据检索与hibernate结合起来?

时间:2010-03-11 20:25:37

标签: java hibernate

为了处理非常大的集合(并且非常大,我的意思是“可能会抛出OutOfMemory异常”),使用Hibernate似乎有问题,因为通常集合检索是在一个块中完成的,即List values = session。 createQuery(“from X”)。list(),您可以整体地获取所有N百万个值,然后处理它们。

我更喜欢做的是将值作为迭代器检索,以便我一次获取1000左右(或任何合理的页面大小)。除了编写我自己的迭代(看起来它可能重新发明轮子)是否有一种以hibernate本地方式来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

实际上,session.scroll()可能比在这种情况下迭代更好。迭代运行一个查询以获取所有ID,然后在处理时逐个获取完整项目。 Scroll使用基础JDBC滚动功能,该功能检索完整对象但保持游标对数据库开放。使用滚动,您可以设置批量大小以确定一次返回的最佳数量。如果加载N百万的ID仍然占用太多内存,滚动就是答案,我怀疑它在任何一种情况下都会更有效。

两者都不会自动关闭会话。

答案 1 :(得分:1)

你可以做到

Iterator iter = session.createQuery("from X").iterate();