我所拥有的以下代码正在按预期工作,但是有更好的方法吗?
我正在使用像队列一样的数据库,并以最大数量的批量处理。我正在考虑如何重构它以使用page.hasNext()
和page.nextPageable()
但是,如果在获取页面和获取下一页之间操纵数据库会发生什么,我找不到任何好的教程/文档。
List<Customer> toBeProcessedList = customerToBeProcessedRepo
.findFirstXAsCustomer(new PageRequest(0, MAX_NR_TO_PROCESS));
while (!toBeProcessedList.isEmpty()) {
//do something with each customer and
//remove customer, and it's duplicates from the customersToBeProcessed
toBeProcessedList = customerToBeProcessedRepo
.findFirstXAsCustomer(new PageRequest(0, MAX_NR_TO_PROCESS));
}
答案 0 :(得分:1)
如果对请求的每个页面使用分页支持,则会执行新的sql语句,如果你不做某些花哨的事情(可能是愚蠢的),它们会在不同的事务中执行。当用户从一个页面移动到另一个页面时,这可能导致多次获取元素或者根本看不到它们。
示例:页面大小3;要开始的要素:A,B,C,D,E,F
用户打开第一页并看到
A,B,C(总页数为2)
元素X在B之后插入;用户移动到下一页并看到
C,D,E(现在总页数为3)
如果不是添加X,而是删除C,则第2页将显示
E,F
因为D移动到第一页。
理论上,人们可以拥有一个具有读取稳定性的长时间运行事务(如果底层数据库支持),那么可以获得一致的页面,但这会产生如下问题:
此交易何时结束,以便用户看到新的/已更改的数据
当用户离开时,此交易何时结束?
这种方法会产生一些相当高的资源成本,而实际效益并不明显
因此,在100个案例中的99个中,默认方法非常合理。
脚注:我假设关系型数据库,但其他商店的行为应该基本相同。