【问题标题】:How to retrieve/set SQL query for an ItemReader from database?如何从数据库中检索/设置 ItemReader 的 SQL 查询?
【发布时间】:2019-04-19 19:07:36
【问题描述】:

我有 spring 批处理程序,它从数据库中读取数据并对其进行处理,然后将其插入(使用 ItemWriter)到数据库中的其他表中。这里我对 ItemReader、ItemProcessor 和 ItemWriter 使用了一堆 SQL 查询。

我的要求是将所有这些查询存储在具有参数和值格式的表中,并通过单个 DB 调用检索它并将其传递给 ItemReader 或 ItemProcessor 或 ItemrWriter。因此,如果将来查询有任何变化,我们最终将只进行数据库更新,而代码将保持不变。

我尝试在 beforeJob 部分执行,但我遇到错误说“java.lang.IllegalArgumentException:必须提供 SQL 查询”。但是我可以通过在 ItemReader 方法中进行数据库调用来成功地做到这一点。我试图避免这种方法,因为我需要为每个 ItemReader、ItemProcessor 和 ItemWriter 进行 db 调用。请告诉我如何实现这一目标?

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    您可以使用 tasklet 创建一个步骤,该步骤从数据库读取查询并将其添加到某个键下的执行上下文中,然后使用来自执行上下文的查询配置面向块的步骤的读取器。这是一个简单的例子:

    1。检索查询并将其放入执行上下文中:

    @Bean
    public Tasklet queryRetrievalTasklet() {
        return (contribution, chunkContext) -> {
            String query = ""; // retrieve query from db (using a JdbcTemplate for example)
            chunkContext.getStepContext().getJobExecutionContext().put("query", query);
            return RepeatStatus.FINISHED;
        };
    }
    

    2。使用执行上下文中的查询配置阅读器

    @Bean
    @StepScope
    public ItemReader<Integer> itemReader(@Value("#{jobExecutionContext['query']}") String query) {
        // return your reader configured with the query
        return null;
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      在我看来,这种配置通常是将查询存储在属性而不是数据库中。喜欢:

      batch.query.unload=SELECT ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-29
        • 2014-05-21
        • 2021-01-07
        • 1970-01-01
        • 2016-03-17
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多