Spring 批处理分区从 JDBCItemWriter StepScope 或默认 Bean 范围

Spring Batch Partition Slave JDBCItemWriter StepScope or Default Bean Scope

请告知 Spring 批处理分区从属“JdbcBatchItemWriter”范围。目前我们已经定义了 30 个分区的默认 Bean 范围。根据文档说 JdbcBatchItemWriter 是线程安全的。请注意我们的 Reader 是 "STEPSCOPE"

下面的代码片段供作者

        @Bean
        public JdbcBatchItemWriter<UnifiedInvoiceDTO> summaryWriter() {
            JdbcBatchItemWriter<UnifiedInvoiceDTO> databaseItemWriter = new JdbcBatchItemWriter<>();
            databaseItemWriter.setDataSource(dataSource);
            databaseItemWriter.setSql(BSCSUtils.QUERY_INSERT_UBI_SUMMARY);
            ItemPreparedStatementSetter<UnifiedInvoiceDTO> invoicePreparedStatementSetter = new InvoiceSummarySetter();
            databaseItemWriter.setItemPreparedStatementSetter(invoicePreparedStatementSetter);
            return databaseItemWriter;
        }

因为我们有多个表,所以下面是 Composite writer 的代码片段

        @Bean
        public CompositeItemWriter compositeWriter() throws Exception {
            CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
            List<ItemWriter> writers = new ArrayList<ItemWriter>();
            logger.info("Composite Writer Started");
            writers.add(summaryWriter());
            writers.add(detailsWriter());
            writers.add(chartWriter());
            compositeItemWriter.setDelegates(writers);
            return compositeItemWriter;
        }

我们的问题

  1. 我们是否需要制作 Composite writer 和 JDBCwriter "StepScope" 以避免任何并发问题。根据文档说 JdbcBatchItemWriter 是线程安全的。
  2. 由于默认的 Bean 范围,我们在插入(批量提交)时是否有任何延迟。

请指教

  1. 如果编写器被记录为线程安全的,那么您可以在多线程步骤中使用它。我会用自己的 reader/writer 实例配置每个工作步骤,以确保没有并发问题。
  2. 我看不出两者之间有什么关系。分区的想法是工作人员并行执行,因此您将拥有并行事务。现在,在多个并行事务中使用共享编写器与使用多个编写器是您需要进行试验和基准测试的事情。