Spring 批处理 Reader 用于分布式 DB2 数据库
Spring Batch Reader for distributed DB2 database
我正在尝试使用 Spring 批处理框架编写作业。作业需要从集群 db2 数据库中获取数据,对每个获取的记录调用一些逻辑,然后将转换后的数据存储在同一个数据库中(与读取位置不同 table)。我正在尝试如下编写 step1
,
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
ItemReader<RemittanceVO> reader, ItemWriter<RemittanceClaimVO> writer,
ItemProcessor<RemittanceVO, RemittanceClaimVO> processor) {
return stepBuilderFactory.get("step1")
.<RemittanceVO, RemittanceClaimVO> chunk(100).reader(reader)
.processor(processor).writer(writer).build();
}
目前,由于数据库是 DB2 和集群,我面临两个挑战,
1.
为元数据提供的 SQLs 在 -
/org/springframework/batch/core/schema-db2.sql
不适用于
分布式 DB2。它在命令 constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
上失败。
写在这个文件中的查询可以是
调整为分布式 db2 或者我也可以手动创建 tables 但我是
不确定我是否应该手动创建 tables?如果那会有一些
进一步的并发症?
我需要所有这些 table,因为我想使用 Spring 批处理来实现其 PAUSE
、 RESTART
功能。
2.
我们需要在 DB2 上触发所有 SELECT 查询
READ ONLY WITH UR
SO
问题。
如果我们不 运行 使用此关键字进行查询,数据库可能会被锁定。
第 2 点的问题是我无法在 Spring 批处理(JdbcPagingItemReader
等)的内置 reader 类 中使用,因为它们不支持这个 db2 特定的关键字。
通过阅读 Internet 上无用的简单示例来解释该框架的优点,我认为我会在很短的时间内起床 运行,但看起来我必须编写自己的查询提供程序 类,研究元数据 sql,如果 db 恰好是 DB2 并且是分布式的怎么办。
有没有人为分布式 Db2 数据库实施过类似的工作并在以上几点上指导我?
我想,为了解决第 1 点,我将手动创建表,因为我在 中确认表不会自动删除,因此不需要重新创建。手册 activity 一次就够了。
我将通过在事务级别指定隔离级别来解决第 2 点,这样就不需要 WITH UR
in SELECT 查询,
@Autowired
private DataSource dataSource;
@Bean
public TransactionTemplate transactionTemplateUR(){
TransactionTemplate txnTemplate = new TransactionTemplate();
txnTemplate.setIsolationLevelName("ISOLATION_READ_UNCOMMITTED");
txnTemplate.setTransactionManager(txnManager);
return txnTemplate;
}
@Bean
public PlatformTransactionManager txnManager(DataSource dataSource){
DataSourceTransactionManager txnManager = new DataSourceTransactionManager();
txnManager.setDataSource(dataSource);
return txnManager;
}
我正在尝试使用 Spring 批处理框架编写作业。作业需要从集群 db2 数据库中获取数据,对每个获取的记录调用一些逻辑,然后将转换后的数据存储在同一个数据库中(与读取位置不同 table)。我正在尝试如下编写 step1
,
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
ItemReader<RemittanceVO> reader, ItemWriter<RemittanceClaimVO> writer,
ItemProcessor<RemittanceVO, RemittanceClaimVO> processor) {
return stepBuilderFactory.get("step1")
.<RemittanceVO, RemittanceClaimVO> chunk(100).reader(reader)
.processor(processor).writer(writer).build();
}
目前,由于数据库是 DB2 和集群,我面临两个挑战,
1.
为元数据提供的 SQLs 在 -
/org/springframework/batch/core/schema-db2.sql
不适用于
分布式 DB2。它在命令 constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
上失败。
写在这个文件中的查询可以是 调整为分布式 db2 或者我也可以手动创建 tables 但我是 不确定我是否应该手动创建 tables?如果那会有一些 进一步的并发症?
我需要所有这些 table,因为我想使用 Spring 批处理来实现其 PAUSE
、 RESTART
功能。
2.
我们需要在 DB2 上触发所有 SELECT 查询
READ ONLY WITH UR
SO
问题。
如果我们不 运行 使用此关键字进行查询,数据库可能会被锁定。
第 2 点的问题是我无法在 Spring 批处理(JdbcPagingItemReader
等)的内置 reader 类 中使用,因为它们不支持这个 db2 特定的关键字。
通过阅读 Internet 上无用的简单示例来解释该框架的优点,我认为我会在很短的时间内起床 运行,但看起来我必须编写自己的查询提供程序 类,研究元数据 sql,如果 db 恰好是 DB2 并且是分布式的怎么办。
有没有人为分布式 Db2 数据库实施过类似的工作并在以上几点上指导我?
我想,为了解决第 1 点,我将手动创建表,因为我在
我将通过在事务级别指定隔离级别来解决第 2 点,这样就不需要 WITH UR
in SELECT 查询,
@Autowired
private DataSource dataSource;
@Bean
public TransactionTemplate transactionTemplateUR(){
TransactionTemplate txnTemplate = new TransactionTemplate();
txnTemplate.setIsolationLevelName("ISOLATION_READ_UNCOMMITTED");
txnTemplate.setTransactionManager(txnManager);
return txnTemplate;
}
@Bean
public PlatformTransactionManager txnManager(DataSource dataSource){
DataSourceTransactionManager txnManager = new DataSourceTransactionManager();
txnManager.setDataSource(dataSource);
return txnManager;
}