Tag: scrollableresults

使用Hibernate的ScrollableResults缓慢读取9000万条logging

我只需要使用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]); 问题是,上述将试图加载所有9000万行到RAM之前转移到while循环…这将杀死我的内存与OutOfMemoryError:Java堆空间exception:(。 所以我想ScrollableResults不是我正在寻找? 处理这个问题的正确方法是什么? 我不介意,如果这个while循环需要几天(好吧我不喜欢它)。 我想唯一的方法来处理这个是使用setFirstResult和setMaxResults遍历结果,只是使用常规的Hibernate结果,而不是ScrollableResults。 这感觉就像是效率不高,而且在第89万行调用setFirstResult的时候会开始花费很长的时间。 更新:setFirstResult / setMaxResults不起作用,事实certificate需要很长时间才能到达像我担心的偏移量。 这里必须有一个解决scheme! 这不是一个相当标准的程序? 我愿意放弃Hibernate并使用JDBC或其他方法。 更新2:我提出的解决scheme,工作好,不是很好,基本上是这样的forms: select * from person where id > <offset> and <other_conditions> limit 1 由于我还有其他的条件,即使是在索引中的所有条件,它仍然没有我想要的那么快……所以还是有其他的build议。