适用版本
SpringBatch 3.0.8
Spring4.3
依赖:
本文中的示例依赖[SpringBath-使用MyBatis],我头条中另一篇文章
分区原理
如果任务需要处理的数据量非常大,单线程处理在性能上肯定不能满足要求,通常的做法是使用多线程,而SpringBatch中的ItemReader和ItemWriter因为要记录状态数据(以便任务可以重启)所以是线程不安全的,即使通过牺牲性能,将ItemReader改为线程安全(reader方法添加synchronized),也会牺牲SpringBatch的一些特性,比如任务重启。所以SpringBatch通过分区机制来解决大数据量的批处理任务。
根据分区策略将一个任务拆分为多个区,每个区有独立的数据读、处理、写操作。每个区由一个单独的线程来执行。
简单来说就是:将一张大表根据where条件拆分为N块,每一块都是一个线程来处理,每个线程都是独立的数据读、处理、写操作,每一块SpringBatch都独立记录状态数据,保证其重启等特性正常运转。
分区核心:分区策略
SpringBatch提供一个分区接口,我们需要根据实际情况来实现自己的分区逻辑。在分区策略实现中,将分区的标识放到ExecutionContext上下文中,ItemReader通过#{stepExecutionContext[自定义Key]}来从上下文中拿分区标识。
分区核心配置
关注点:
分区需要单独配置一个Step,指定分区的个性,引用分区策略,引用数据读、处理、写的Step
数据读、处理、写的Step配置在Job之外
分区策略配置
【关键点】在ItemReader中定义分区策略标识,用于将数据分为多个区:_minRecord和_maxRecord变量是分区策略类中定义的
运行结果
在BATCH_STEP_EXECUTION表中可以看到如下数据:partitionStep是XML中定义的定义名称,可以看到该步骤被拆分为partitionReadWriteDB:partition0,partitionReadWriteDB:partition1、partitionReadWriteDB:partition2三个区,分别执行和记录状态数据。
partitionStep记录了三个分区处理的总的结果:一共处理了10000条数据,提交数据库12次
partitionReadWriteDB:partition0分区:一共处理334条数据,提交数据库4次