Spring Batch Reader的多个SELECT SQL - 读者链接

时间:2016-09-09 08:01:05

标签: java spring-batch

我需要在Spring Batch阅读器中按顺序执行11个SQL SELECT查询。这些SELECT SQL在相当大的表上执行INNER JOIN,并通过WHERE子句中的单个列名相互区分。

所有这些读者的输出对象类型都是相同的,比方说VO

那么我该如何实现呢?

我可以在读者中传递where String的where子句,这将在查询提供者中进一步设置。

@Bean
public ItemReader<VO> reader(String whereClause, @Value("#{stepExecutionContext[partitionNumber]}") String partitionNumber){

}

我不确定如何构建Spring Batch步骤,它按顺序在阅读器中设置这11个SQL并按顺序执行它们。由于所有阅读器的输出类型相同,因此会有单处理器和单个写入器。

所有这些读者的来源都是相同的数据库表,并且由于分页功能,我想使用JdbcPagingItemReader

我当前的读者是分区步骤的一部分,其中String partitionNumber是分区标准。

我的意思是,如果输出类型很常见,我可以链接读者吗?如果这些读者按顺序被踢,我没有问题,但是我可以为单个处理器和编写者定义一个由读者链组成的步骤吗?

请建议解决方案或更好的策略。

1 个答案:

答案 0 :(得分:1)

这是一种方法

  1. 分区程序级别 这将成为推动读者阅读的最佳来源。在这种情况下,我们将设置Grid-Size = 1,并将任务作为SyncTask(不是AsyncTask)执行。
  2. 以下是代码段

    <job id="exampleJob" xmlns="http://www.springframework.org/schema/batch">
                  <step id="stepId">
                         <partition step="partitionerStepId" partitioner="examplePartitioner">
                                <handler grid-size="1" task-executor="syncTaskExecutor" />
                         </partition>
                  </step>
           </job>
    
           <step id="partitionerStepId" xmlns="http://www.springframework.org/schema/batch">
                  <tasklet>
                         <chunk reader="exampleReader" writer="exampleWriter" processor="exampleProcessor" commit-interval="1"/>
                  </tasklet>
           </step>
    

    public class ExamplePartitioner实现了Partitioner {

    @Override
    public Map<String, ExecutionContext> partition(int gridSize) {
        Map<String, ExecutionContext> queue = new HashMap<String, ExecutionContext>();
    
        for (int i=0; i<NUMBER_QUERIES; i++) {
            ExecutionContext ec = new ExecutionContext();
            **ec.put("sql", [your query]);**
    
            queue.put("item"+i, ec);
        }
    
        return queue;
    }
    

    }

    注意:对于您的情况,NUMBER_QUERIES为11。 注意:您可以将查询内容存储在安全的位置,也可以将其作为常量保存在类中。我不太确定查询是否有参数,因为你还没有提到过。

    1. 阅读器 enter image description here 注意:请构建&#39; exampleRowMapper&#39;映射到VO对象。
    2. 总而言之,Partitioner将构建一个列表查询并将它们放入ExecutionContext并通过&#34;#{stepExecutionContext [&#39; sql&#39;]}将它们按顺序传递给Reader。

      谢谢, Nghia酒店

      注意:我在格式化Reader时遇到问题,这就是我将其作为图像放置的原因。 注意:有关详细信息,请参阅here

      中的链接