使用Hibernate的RollableResults可以缓慢读取9000万条记录
我只需要使用Hibernate读取MySQL数据库中表中的每一行,并基于它编写一个文件。但是有9000万行,它们非常大。因此,以下似乎是合适的:
ScrollableResults results = session.createQuery("SELECT person FROM Person person")
.setReadOnly(true).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
while (results.next())
storeInFile(results.get()[0]);
问题是,在进入while循环之前,上述将尝试将所有9000万行加载到RAM中...这将扼杀我的记忆与OutOfMemoryError:Java堆空间异常:(。
所以我想可滚动的结果不是我想要的吗?处理这个问题的正确方法是什么?我不介意这个同时循环是否需要几天(好吧,我希望不要这样做)。
我想处理这个问题的唯一其他方法是使用setFirstResult和setMaxResults来迭代结果,并且只使用常规的Hibernate结果而不是ScrollableResults。这感觉效率低下,当我在第8900万行调用setFirstResult时,它将开始花费可笑的很长时间......
更新:setFirstResult/setMaxResults不起作用,事实证明,像我担心的那样,需要很长时间才能达到偏移量。这里一定有解决方案!这不是一个非常标准的程序吗?我愿意放弃Hibernate,使用JDBC或任何需要的东西。
更新2:我想出的解决方案工作正常,不是很好,基本上是以下形式:
select * from person where id > <offset> and <other_conditions> limit 1
由于我有其他条件,即使全部在索引中,它仍然没有我希望的那么快......所以仍然开放其他建议..