我正在尝试使用Spring批处理框架编写作业。作业需要从集群db2数据库中获取数据,在每个获取的记录上调用一些逻辑,然后将转换后的数据存储在同一个数据库中(与读取数据的位置不同)。我正在尝试编写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
为元数据提供的SQL -
/org/springframework/batch/core/schema-db2.sql
不起作用
分布式DB2。它失败了命令,constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
。
用这个文件写的查询可以 调整到分布式db2或我也可以手动创建表,但我 不确定我是否应该手动创建表格?如果那会有一些 更复杂?
我需要所有这些表,因为我想将Spring批处理用于其PAUSE
,RESTART
功能。
2
我们需要在DB2上触发所有SELECT查询
使用READ ONLY WITH UR
SO
question。
如果我们不使用此关键字运行查询,则db可能会被锁定。
第2点的问题是我不能在Spring Batch(JdbcPagingItemReader
等)的内置读者类中使用,因为那些不支持这个db2特定关键字。
通过在Internet上阅读无用的简单示例来解释这个框架的优点,我认为我将在很短的时间内启动并运行但看起来我必须编写自己的查询提供程序类,研究元数据sqls和什么不是如果db碰巧是DB2并分发的。
是否有人为分布式Db2数据库实施了类似的工作并指导我以上几点?
答案 0 :(得分:0)
我想,为了解决第一点,我将手动创建表格,因为我已在another question中确认表格不会自动删除,因此不需要重新创建。一次手动活动应该足够了。
我将通过在事务级别指定隔离级别来解决第2点,因此不需要SELECT查询中的WITH UR
,
@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;
}