代码之家  ›  专栏  ›  技术社区  ›  Steve B.

有没有办法把流式数据检索和hibernate结合起来?

  •  2
  • Steve B.  · 技术社区  · 15 年前

    为了处理非常大的集合(我的意思是“可能抛出内存异常”),使用Hibernate似乎有问题,因为通常集合检索是在一个块中完成的,即list values=session.createquery(“from x”).list(),其中获取所有的N百万值,然后对它们进行处理。

    我更愿意做的是以迭代器的形式检索值,这样我一次就可以获取1000个左右(或者任何合理的页面大小)。除了编写我自己的迭代(看起来很可能是在重新发明轮子)之外,有没有hibernate原生的方法来处理这个问题?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Mike Thomsen    15 年前

    你可以做到

    Iterator iter = session.createQuery("from X").iterate();
    
        2
  •  3
  •   Brian Deterling    15 年前

    实际上,在这种情况下session.scroll()可能比iterate更好。iterate运行一个查询来获取所有id,然后在处理它们时逐个获取完整的项。scroll使用底层的jdbc scroll功能,该功能检索完整的对象,但保持游标对数据库的打开状态。使用scroll,您可以设置批大小,以找出一次返回的最佳数量。如果加载N百万的ID仍然占用了太多的内存,滚动就是答案,我怀疑在这两种情况下它都会更有效。

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