首页 > 解决方案 > Spring Batch Partition Slave JDBCItemWriter StepScope 或 Default Bean Scope

问题描述

请告知 Spring 批处理分区 Slave " JdbcBatchItemWriter" 范围。目前我们已经定义为具有 30 个分区的默认 Bean 范围。根据文档说JdbcBatchItemWriter是线程安全的。请注意我们的阅读器是“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;
        }

下面是复合编写器的代码片段,因为我们有多个表

        @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. 我们是否需要制作复合编写器和JDBCwriter“StepScope”以避免任何并发问题。根据文档说JdbcBatchItemWriter是线程安全的。
  2. 由于默认的 Bean 范围,我们在插入(批量提交)时是否有任何延迟。

请指教

标签: spring-bootspring-batch

解决方案


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

推荐阅读