我尝试设置预定作业来清理数据库中的某些项目。我们有很多要清理的记录,并希望能够限制每次启动作业时删除的项目数量,即使有更多项目与查询匹配。
所以我设置了一个预定的spring quartz批处理作业,它根据某个cron表达式启动(例如,每分钟)。该作业由扩展JpaPagingItemReader,ItemProcessor和JpaItemWriter(将调用entityManager.remove(item)而不是persist)的java类处理。
我尝试使用commit-interval和pageSize,但我无法掌握它的工作原理。我以为我可以限制使用commit-interval处理的数量。因为我从这里的另一个类似的帖子中了解到它代表了每个块处理的项目数量。但是作业处理的项目比我在提交间隔中设置的项目多。
当发生以下情况时,我更加困惑。我将commit-interval设置为5,将pageSize设置为3(因为我试图观察差异是什么)。我观察到,每次启动时,该作业都会处理数据库中一半的项目(每2分钟一次)。所以第一次它从99变为48,然后从48变为24,然后从24变为12,然后从12变为6.我不知道为什么会导致这种行为。
pageSize按预期工作,我看到它在读取器/处理器/写入器中循环我在pageSize中设置的项目数量。
然后在另一个测试中,我在数据库中有1200个项目,并将commit-interval和pageSize设置为1500,并且它一次处理所有项目,但它似乎完全忽略了pageSize。所以是的,我完全糊涂了。
在实践中,我们将运行更大的数量。总的来说,我们有几百万件需要拆除,需要生产和运行,所以我们正在努力找出最好的方法。很高兴让它运行让我们每分钟说,每次运行删除200个项目,并根据其性能负荷进行调整。