首页 > 解决方案 > 使用 RepositoryItemReader 更新春季批次中的记录后出现问题

问题描述

我有一批,我正在使用 spring data JPA 来查询然后更新记录。我使用条件(代码为空)搜索表(RepositoryItemReader)的记录。我有一个处理逻辑(ProcessorBatch),最后我更新了代码值。之后,我更新记录(RepositoryItemWriter)。

但是这个搜索我每 10 次中的 10 次进行一次。当我更新代码字段(用于搜索条件)时,就会出现问题,因为分页失败并跳过了 10 条记录。然后更新 10 条记录,然后跳过 10 条记录,直到结束。

在最终日志中,READ = 5000 WRITE = 5000 SKIP = 0出现。但是数据库中有10000条记录

每次他返回查询记录时,他都会在示例中的 select count (generatedAlias0) 之前执行该查询generatedAlias0 where generatedAlias0.code is null

随之,记录总数发生变化,因为代码不再为空。

我做了一个测试,如果在处理过程中我更新了代码字段以外的另一个字段,它可以正常工作。

有没有人建议我继续找分页记录,以免影响性能和正常更新?

我有以下代码:

批量配置

    @Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Bean
    public Step exampleStep(ExampleRepository exampleRepository, ProcessorBatch processorBatch, StepBuilderFactory steps)  {
        RepositoryItemReader<Example> reader = getReader(exampleRepository);
        RepositoryItemWriter<Example> writer = getWriter(exampleRepository);

        return steps.get("exampleStep")
                .<Example, Example> chunk(10)
                .reader(reader)
                .listener(new StepListener())
                .processor(processorBatch)
                .writer(writer)
                .faultTolerant()
                .skipPolicy(new CustomSkipPolicy())
                .build();
    }


    private RepositoryItemReader<Example> getReader(ExampleRepository exampleRepository) {
        RepositoryItemReader<Example> reader = new RepositoryItemReader<>();
        reader.setRepository(exampleRepository);
        reader.setMethodName("findByCodeIsNull");
        reader.setSort(Collections.singletonMap("code", Sort.Direction.ASC));
        reader.setPageSize(10);
        return reader;
    }


    private RepositoryItemWriter<Example> getWriter(ExampleRepository exampleRepository) {
        RepositoryItemWriter<Example> writer = new RepositoryItemWriter<>();
        writer.setRepository(exampleRepository);
        writer.setMethodName("save");
        return writer;
    }

 
    @Bean
    public Job job(JobBuilderFactory jobBuilderFactory, ExampleRepository exampleRepository, ProcessorBatch processorBatch, JobBuilderFactory jobs, StepBuilderFactory steps) {
        BatchConfiguration batchConfiguration = new BatchConfiguration();
        return jobs.get("job")
                .incrementer(new RunIdIncrementer())
                .start(batchConfiguration.exampleStep(exampleRepository, processorBatch, steps))
                .build();
    }
    
}   

处理器批次

public Example process(Example example) throws StepSkipException {
        example.setCode("code");
        return example;
    }

运动存储库

@Repository
public interface ExampleRepository extends JpaRepository<Example, Integer> {
    
    Page<Movimento> findByCodeIsNull(Pageable pageable);

}

标签: javaspring-bootspring-data-jpaspring-batch

解决方案


推荐阅读