【问题标题】:Spring Batch multiple insert for a one readSpring Batch 多次插入一次读取
【发布时间】:2017-02-09 17:09:29
【问题描述】:

我有一个 Spring Batch 进程,它从 CSV 读取报告对象并将分析对象正确插入到 MySQL 数据库中,但是对于每个读取的报告,逻辑已经更改为多个分析插入。

我是 Spring Batch 的新手,实际过程对我来说非常困难,我不知道如何进行此更改。

我没有XML配置,都是带注释的。 Report 和 Analytics 类对 adId 和 value 这两个字段有一个 getter 和一个 setter。新逻辑有七个 adId 值,我需要在表中插入七行。

我隐藏、删除或隐藏了一些对问题没有贡献的代码。

这是我的 BatchConfiguration.java:

@Configuration
@EnableBatchProcessingpublic
class BatchConfiguration {
    @Autowired
    private transient JobBuilderFactory jobBuilderFactory;

    @Autowired
    private transient StepBuilderFactory stepBuilderFactory;

    @Autowired
    private transient DataSource dataSource;

    public FlatFileItemReader<Report> reader() {
        // The reader from the CSV works fine.
    }

    @Bean
    public JdbcBatchItemWriter<Analytic> writer() {
        final JdbcBatchItemWriter<Analytic> writer = new JdbcBatchItemWriter<Analytic>();
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Analytic>());
        writer.setSql("INSERT INTO TABLE (ad_id, value) VALUES (:adId, :value)");
        writer.setDataSource(dataSource);
        return writer;
    }

    @Bean
    public AnalyticItemProcessor processor() {
        return new AnalyticItemProcessor();
    }

    @Bean
    public Step step() {
        return stepBuilderFactory.get("step1").<Report, Analytic> chunk(10000).reader(reader()).processor(processor()).writer(writer()).build();
    }

    @Bean
    public Job process() {
        final JobBuilder jobBuilder = jobBuilderFactory.get("process");

        return jobBuilder.start(step()).build();
    }
}

然后是 AnalyticItemProcessor.java

public class AnalyticItemProcessor implements ItemProcessor<Report, Analytic> {
    @Override
    public Analytic process(final Report report) {
        // Creates a new Analytic call BeanUtils.copyProperties(report, analytic) and returns analytic.
    }
}

以及过程:

@SpringBootApplication
public class Process {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Process.class, args);
    }
}

如何进行此更改?也许使用 ItemPreparedStatementSetter 或 ItemSqlParameterSourceProvider?谢谢。

【问题讨论】:

    标签: java spring-batch


    【解决方案1】:

    如果我正确理解了您的问题,您可以使用 CompositeItemWriter 包装多个 JdbcBatchItemWriter 实例(每个插入需要完成一个)。这将允许您在每个项目中插入多行。否则,您需要编写自己的 ItemWriter 实现。

    【讨论】:

    • 感谢@Michael Minella,ItemWriter 的实现还不错。非常重要的包括“writer.afterPropertiesSet();”就像 Avis 在 stackoverflow.com/questions/32656581/… 中所说的那样
    • 如果您将每个代理配置为一个 bean,则不需要。容器会为你做这件事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多