与Spring Data JPA同时进行的步骤

时间:2017-06-08 13:16:18

标签: spring-boot spring-data-jpa spring-batch

通过在步骤bean声明中添加任务执行程序,可以非常容易地使Step的Chunks同时运行,如下所示:

@Bean
public TaskExecutor taskExecutor(){
    SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor("taskExecutor");
    taskExecutor.setConcurrencyLimit(5);
    return taskExecutor;
}

@Bean
public Step logGroupedDeductionStep(){
    return stepBuilderFactory.get("logGroupedDeductionStep")
            .<DeductionType, GroupedDeductionTransactionDTO>chunk(50)
            .reader(groupedDeductionItemReader)
            .processor(groupedDeductionItemProcessor)
            .writer(groupedDeductionItemWriter)
            .taskExecutor(taskExecutor())
            .build();
}

在我的读者,处理器和编写器中,我使用Spring Data JPA来获取和写入数据到持久层(MySQL)。

我的问题是,如果我这样做,这是否意味着不同的线程会在某个时刻读取相同的实体,因此会写出重复的记录?

如何使处理(和写入)在不同的线程中发生,但读者成为一个(如数据源)?

请遮光。

1 个答案:

答案 0 :(得分:0)

您可以在JPA中使用Locking来限制并发客户端异步更改您的实体。

interface UserRepository extends Repository<User, Long> {

    // Plain query method
    @Lock(LockModeType.READ)
    List<User> findByLastname(String lastname);

}

This博客解释了为何/何时使用Locking