问题:如何一次处理(读入)1000 条记录的批次,并确保只有当前批次的 1000 条记录在内存中?假设我的主键被称为 ' ID
' 并且我的表被称为Customer
。
背景:这不是用于用户分页,而是用于编译有关我的表的统计信息。我的可用内存有限,因此我想一次读取 1000 条记录的记录。我只是在阅读记录,它们不会被修改。我读过这StatelessSession
对这种事情有好处,而且我听说过人们使用ScrollableResults
.
我尝试过的:目前我正在开发一个定制的解决方案,在该解决方案中我实现了 Iterable 并且基本上使用setFirstResult
and进行了分页setMaxResults
。这对我来说似乎很慢,但它允许我一次获得 1000 条记录。我想知道如何更有效地做到这一点,也许使用类似ScrollableResults
. 我还不确定为什么我目前的方法这么慢;我按 ID 排序,但 ID 是主键,所以表应该已经被索引了。
正如您可能会说的,我一直在阅读有关如何执行此操作的点点滴滴。如果有人可以为我提供一个完整的方法来做到这一点,将不胜感激。我确实知道您必须设置并且调用会将实体从内存FORWARD_ONLY
中取出(除非您正在执行二级缓存,我还不知道如何检查我是否存在)。但是,我在 JavaDoc 中看不到任何方法可以一次读取 1000 条记录。我希望在可用内存不足和网络性能缓慢之间取得平衡,因此一次通过网络发送一条记录真的不是这里的选择。我尽可能使用 Criteria API。感谢任何详细的答复。ScrollableResults
evict(entity)