繁体   English   中英

用于Spring Batch Reader的多个SELECT SQL-阅读器链接

[英]Multiple SELECT SQLs for Spring Batch Reader - reader chaining

我需要在Spring Batch阅读器中顺序执行十一个SQL SELECT查询。 这些SELECT SQL在很大的表上进行INNER JOIN ,并且通过WHERE子句中的单个列名彼此进行比较。

所有这些阅读器的输出对象类型都是相同的,可以说VO

那么我该如何实现呢?

我可以在阅读器中传递where子句String ,该子句将在查询提供程序中进一步设置。

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

}

我不确定如何构造Spring Batch步骤,该步骤在阅读器中顺序设置这11条SQL,然后也顺序执行。 由于所有读取器的输出类型相同,因此将只有一个处理器和一个写入器。

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

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

我要问的是,如果读者的输出类型是通用的,我可以将他们链接起来吗? 如果这些阅读器顺序启动,我没有问题,但是我可以定义一个由单个处理器和编写器的阅读器链组成的步骤吗?

请提出解决方案或更好的策略。

这是一种方法

  1. 分区程序级别这将是驱动您的阅读器的主要来源。 在这种情况下,我们将设置Grid-Size = 1并将任务作为SyncTask(而非AsyncTask)执行。

下面是代码片段

<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>

公共类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. 读者 在此处输入图片说明 注意:请构建“ exampleRowMapper”以映射到VO对象。

总而言之,分区程序将构建一个列表查询,并将其放入ExecutionContext中,并通过“#{stepExecutionContext ['sql']}”将它们按顺序依次传递给Reader。

谢谢,Nghia

注意:我在格式化阅读器时遇到问题,这就是为什么我将其作为图像放置。 注意:有关更多信息,请从此处参考链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM