首页 文章

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

提问于
浏览
0

我需要在Spring Batch阅读器中按顺序执行11个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 回答

  • 1

    这是一种方法

    • Partitioner level这将是驱动Reader的最佳来源 . 在这种情况下,我们将设置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 . 注意:您可以将查询内容存储在安全的位置,也可以将其作为常量保存在类中 . 我不太确定查询是否有参数,因为你还没有提到 .

    • Reader
      enter image description here
      注意:请构建'exampleRowMapper'以映射到VO对象 .

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

    谢谢,Nghia

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

相关问题