【发布时间】:2017-01-07 22:00:33
【问题描述】:
我写了一个 spring 批处理作业并使用SimpleAsyncTaskExecutor。我尝试使用ThreadPoolExecutor,但这比SimpleAsyncTaskExecutor 的性能要慢得多。
这些是工作的要点,
1.处理部分工作是最耗时的部分。它基本上将大量SQL SELECTs 触发到与读取器和写入器不同的数据库表中。
Reader 和 Writer 不需要太多时间。Processor 非常复杂。
2. 处理器返回记录后立即将处理器的输出写入数据库的功能要求。这是必要的,因为
处理器为作家找到东西的情况很少见,我们需要
结果立即持续。简而言之,它是一项业务
要求有chunk size =1
我担心工作的表现。如果我让处理器逻辑有点轻量级,性能会增加很多,所以我猜处理器是瓶颈。
我只是使用SimpleAsyncTaskExecutor 来实现并行性。作业应该在功能强大的多处理器系统上运行。
关于我可以在 Spring Batch 方面做些什么以加快这项工作的任何想法?
工作只有这一步。
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
ItemReader<RemittanceVO> syncReader, ItemWriter<RemittanceClaimVO> writer,
ItemProcessor<RemittanceVO, RemittanceClaimVO> processor) {
return stepBuilderFactory.get("step1")
.listener(zeroReadRowsStepExecutionListener)
.<RemittanceVO, RemittanceClaimVO> chunk(Constants.SPRING_BATCH_CHUNK_SIZE)
.reader(syncReader)
.listener(afterReadListener)
.processor(processor)
.writer(writer)
.taskExecutor(simpleAsyntaskExecutor)
.throttleLimit(Constants.THROTTLE_LIMIT)
.build();
}
【问题讨论】:
标签: spring-batch