首页 > 解决方案 > 是否可以使用不同的 sql 对象(字符串)在步骤之间共享阅读器?

问题描述

所有,我正在尝试从 db 表(2 个不同的 sql 查询)中读取以在批处理作业中处理它们,最后将数据存储在目标表中。这只是一个原型,所以我想尝试使用共享阅读器的可扩展解决方案。意思是,我想要一种阅读器方法,该方法可以从相同的 ds 中读取,但使用动态 sqls。我尝试的是:

        @Bean (destroyMethod="")
        @StepScope
          public JdbcCursorItemReader<Map<String, Object>> factTableReader() 
          {

                  JdbcCursorItemReader<Map<String, Object>> reader = new
                          JdbcCursorItemReader<>();

                          reader.setName("Facts Item Readers/multiple");
                          reader.setDataSource(dataSource); 
                          reader.setSql(sql);
                         // reader.open(this.execContext); 
                          reader.setRowMapper(new EodFactsRowMapper());
                          return reader;

          }

我在步骤调用之前设置了 sql 的值。所以,我的期望是当步进范围的读者将获得 sql 值。但是,读者并没有认识到这种设置。所以我进一步探索并了解可以使用stepexecutioncontext。然而,这似乎是一项乏味的任务(而且我无法让它工作),因为有完整的文档可以显示这种行为。参数化语句不可行,因为我的 sql 完全不同。所以我最终在 2 分钟内以下面的方法结束。最初的可扩展方法花了我几天时间,但没有运气。

          @Bean (destroyMethod="")
          public JdbcCursorItemReader<Map<String, Object>> factTableReader1() 
          {

              System.out.println("+++++++++++++++++++++++INSIDE COMPONENT: READER 1 ++++++++++++++++++++++++");

                  JdbcCursorItemReader<Map<String, Object>> reader = new
                          JdbcCursorItemReader<>();

                          reader.setName("eod Facts Item Readers/multiple");
                          reader.setDataSource(dataSource); 
                          reader.setSql(sql1);
                         // reader.open(this.execContext); 
                          reader.setRowMapper(new EodFactsRowMapper());
                          return reader;

          }

          @Bean (destroyMethod="")
          public JdbcCursorItemReader<Map<String, Object>> factTableReader2() 
          {

              System.out.println("+++++++++++++++++++++++INSIDE COMPONENT: READER 2 ++++++++++++++++++++++++");


                  JdbcCursorItemReader<Map<String, Object>> reader = new
                          JdbcCursorItemReader<>();

                          reader.setName("eod Facts Item Readers/multiple");
                          reader.setDataSource(dataSource); 
                          reader.setSql(sql2);
                         // reader.open(this.execContext); 
                          reader.setRowMapper(new EodFactsRowMapper());
                          return reader;

          }

我通过代码映射列,因此行映射器或处理器没有问题。

任何有助于实现我在这里尝试做的事情都将不胜感激。谢谢。

标签: spring-batch

解决方案


我想尝试使用共享阅读器的可扩展解决方案。

共享状态是可扩展性的第一个敌人。我会通过使用两个阅读器(每个都有自己的 sql 查询)来保持简单和高效,而不是尝试共享一个阅读器并处理并发问题。


推荐阅读