通過之前的介紹,大姐對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();
}