spring-batch - 是否可以使用不同的 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;
}
我通过代码映射列,因此行映射器或处理器没有问题。
任何有助于实现我在这里尝试做的事情都将不胜感激。谢谢。
解决方案
我想尝试使用共享阅读器的可扩展解决方案。
共享状态是可扩展性的第一个敌人。我会通过使用两个阅读器(每个都有自己的 sql 查询)来保持简单和高效,而不是尝试共享一个阅读器并处理并发问题。
推荐阅读
- exe - 如何使可执行文件仅以管理员身份运行(exe 上的 UAC 图标)
- ios - 如何在表格视图中更新集合视图中的数据?
- javascript - 如何获取实际的客户端 URL?
- node.js - 导出 firebaseui 的导入节点模块导致玩笑测试失败,并显示“ReferenceError:未定义窗口”
- android - Android内容Uri不能被其他应用播放
- javascript - 我使用 insertBefore dom 方法在另一个元素之前插入一个元素。但它根本不起作用
- javascript - 如何限制对象Javascript中的元素
- python - 反转随机生成函数
- python - 如何在命令后在 discord.py 中获取用户输入
- android - 使用一个 java 类处理多个资源布局