通过之前的介绍,大姐对spring-batch有了一定的了解。但是当数据量达到十万级时,我们发现之前的JOB运行时间还是比较长的。
spring-batch优化效率可以直接在step中打开spring的多线程,进行多线程运行。当打开多线程之后,十万级的数据运行可以在秒级运行完毕。
打开多线程分两步,1.关闭读取中的状态记录 2.开启spring的多线程 代码如下
@Bean("userReader")
public FlatFileItemReader<User> userReader(){
ClassPathResource classPathResource = new ClassPathResource("text/user.txt");
FlatFileItemReader<User> flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setResource(classPathResource);
//设置跳过行数
flatFileItemReader.setLinesToSkip(1);
//数据转换
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames(new String[]{"userId","userName"});
DefaultLineMapper<User> defaultLineMapper = new DefaultLineMapper<>();
defaultLineMapper.setLineTokenizer(tokenizer);
defaultLineMapper.setFieldSetMapper(fieldSet -> {
User user = new User();
user.setUserId(fieldSet.readString("userId"));
user.setUserName(fieldSet.readString("userName"));
return user;
});
defaultLineMapper.afterPropertiesSet();
//关闭状态记录
flatFileItemReader.setSaveState(false);
flatFileItemReader.setLineMapper(defaultLineMapper);
return flatFileItemReader;
}
@StepScope
@Bean
public Step userStep() {
return stepBuilderFactory.get("userStep")
.<User,User>chunk(2)
.reader(userReader)
.processor(userProcess)
.writer(userWriter)
//打开spring多线程
.taskExecutor(new SimpleAsyncTaskExecutor())
.build();
}