Spring Batch 中的 chunk
我们都知道 Spring Batch 有 2 种任务方式。
主要是在 Step 阶段,在 Step 阶段,我们可以执行一个 Tasklet,我们也可以按照 Chunk 来执行。
主要区别
如果使用 Tasklet 的话,我们可以一个 Step 对应一个 Tasklet,Spring Batch 不允许一个 Step 对应多个 Tasklet。
考虑有一个场景,我们需要使用 Spring Batch 对数据库中的表进行更新,这个表可能每次 Batch 要更新 几千条数据,需要满足每 5 分钟更新一次。
如果我们采取 Tasklet 的方式的话,正常的思维都是读取需要更新的数据,然后逐条进行更新。
这个没有问题吧,但是恰恰问题就在这里。
问题就是在 Spring Batch 使用的事务,Tasklet 在启动的时候会创建一个事务,那么读取 1000 条数据,处理 1000 条数据,写入 1000 条数据都在一个事务里面。
假设这个处理时间超过 5 分钟,下一次的任务又开始启动了,这个时候 Spring Batch 还会启动一个事务。
假设 10 分钟了,我们还是没有完成,Spring Batch 会继续启动任务和创建事务。
结果是什么,这个显而易见了,就是出现事务堆积,导致锁表,然后所有的任务都失败,无法完成。
针对这种场景,我们就需要 chunk 了。
chunk
Chunk 的主要目的就是为了告诉 Spring 一次执行几条记录。
我们如果设置 Chunk 为 1 的话,那么 Spring Batch 每次读取一条记录,处理一条记录,写入一条记录,然后将这个事务进行提交。
这样的话,可以有效的避免事务堆积导致的锁表。
Chunk 的大小,通常比较小,如果一次性设太大了,也会锁表。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2020-10-20 Discourse CentOS 8 全新安装手册
2019-10-20 Spring Boot 如何部署到 Linux 中的服务