首页 > 解决方案 > 如何批量过滤商品?

问题描述

我正在使用 Spring Batch 实现作业,我的简单场景是:

  1. 从文件中读取项目
  2. 处理每个项目
  3. 将项目块写入数据库

问题是我想过滤掉数据库中已经存在的项目。

我的第一次尝试是在第二步中查询当前项目的数据库,如果已经存在,则从 ItemProcessor 返回 null 以便过滤掉该项目。这是不必要的慢,因为每个处理的项目都需要一个查询。

所以我的第二次尝试是重写 ItemWriter 中的 doWrite 方法,以对整个块进行单个查询,并只写入查询中没有匹配的项目。即使性能有了明显的提高,这对我来说也不是很好(这样,Spring Batch 看不到我实际写入数据库的内容,实际上来自 StepContext 的写入和过滤计数器的值错误)。

实现此处理逻辑的正确方法是什么?

标签: springspring-batchspring-data-mongodb

解决方案


您似乎在调用的内容skip(如 中skip the items that are already present in the database)实际上是过滤项目,而不是根据 Spring Batch 的术语跳过它们。Spring Batch 中的跳过功能适用于无效项目(即那些在读取、处理或写入它们时引发异常的项目)。

在您的用例中可以很好地工作的一种常用技术是通过执行“保存或更新”操作使项目编写器具有幂等性。这消除了检查项目是否存在的需要。此外,这在失败的情况下很有用,因为您可以重新运行失败的作业,而无需存储任何进度状态。


推荐阅读