spring - 如何批量过滤商品?
问题描述
我正在使用 Spring Batch 实现作业,我的简单场景是:
- 从文件中读取项目
- 处理每个项目
- 将项目块写入数据库
问题是我想过滤掉数据库中已经存在的项目。
我的第一次尝试是在第二步中查询当前项目的数据库,如果已经存在,则从 ItemProcessor 返回 null 以便过滤掉该项目。这是不必要的慢,因为每个处理的项目都需要一个查询。
所以我的第二次尝试是重写 ItemWriter 中的 doWrite 方法,以对整个块进行单个查询,并只写入查询中没有匹配的项目。即使性能有了明显的提高,这对我来说也不是很好(这样,Spring Batch 看不到我实际写入数据库的内容,实际上来自 StepContext 的写入和过滤计数器的值错误)。
实现此处理逻辑的正确方法是什么?
解决方案
您似乎在调用的内容skip
(如 中skip the items that are already present in the database
)实际上是过滤项目,而不是根据 Spring Batch 的术语跳过它们。Spring Batch 中的跳过功能适用于无效项目(即那些在读取、处理或写入它们时引发异常的项目)。
在您的用例中可以很好地工作的一种常用技术是通过执行“保存或更新”操作使项目编写器具有幂等性。这消除了检查项目是否存在的需要。此外,这在失败的情况下很有用,因为您可以重新运行失败的作业,而无需存储任何进度状态。
推荐阅读
- bash - 为什么正在运行的 cronjob 会导致新的随机 gpg-agent 进程运行并导致 gpg-agent 中的缓存密码无效?
- c# - 从按钮的依赖属性将样式应用于控件
- javascript - $(window).on('load' 不起作用 - 我想在加载时向 html 添加一个按钮
- ios - 在 UIFont 上设置行高
- azure - 声明 Terraform 变量
- java - 使用 maven 插件版本-maven-plugin 的
使用最新版本 最新版本 - python - (已解决)基于文件的字符串/变量在python操作中设置文件路径等
- python - Python:创建一个交换键的子字典
- node.js - react-pdf 从后端 url 渲染图像不加载图像
- drupal - 覆盖 FieldPluginBase 初始化函数 Drupal