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