【问题标题】:Spring Batch for DB2 to SQL migration in batches of keysSpring Batch for DB2 to SQL 批量键迁移
【发布时间】:2019-06-01 02:12:35
【问题描述】:

我有一个包含大约 15 万条记录的 DB2 表。我有另一个具有相同列的 SQL Server 表。表列之一——我们称之为代码——是一个唯一值并被索引。我正在使用 Spring Batch。定期,我会得到一个包含代码列表的文件。例如,一个包含 5 K 个代码的文件。对于文件中的每个代码,我需要从 DB2 表中读取记录,其代码列与文件中的代码匹配,并将这些记录中的一些列插入到 SQL Server 表中。我想使用 SQL 而不是 JPA,并且相信 SQL IN 子句中可以包含多少个值是有限制的(比如说 1000)。这应该是我的块大小吗?

应该如何设计用于执行此操作的 Spring Batch 应用程序?我考虑过以下策略,但需要帮助来决定哪一个(或任何其他)更好。

1) 单步作业,阅读器从文件中读取代码,处理器使用 JdbcTemplate 获取代码块的行,编写器使用 JdbcBatchItemWriter 写入行 - 似乎 JdbcTemplate 在整个作业执行过程中都会有一个开放的数据库连接。

2) JdbcPagingItemReader - Spring Batch 文档提醒 DB2 等数据库具有悲观锁定策略,并建议改用驱动查询

3) 驾驶查询 - 有示例吗? - 处理器如何在这里将密钥转换为完整对象?连接保持打开多长时间?

4) 链接阅读器 - 这可能吗? - 第一个读取器将从文件读取,第二个从 DB2 读取,然后是处理器和写入器。

【问题讨论】:

    标签: sql-server db2 spring-batch


    【解决方案1】:

    我会选择你的选项#1。您包含唯一codes 的文件有效地成为您的驾驶查询。

    您的ItemReader 将读取文件并将每个code 发送到您的ItemProcessor。

    ItemProcessor 可以直接使用JdbcTemplate,也可以委托给项目中的单独数据访问对象 (DAO),但无论哪种方式,每次调用 process 方法都会生成一条新记录从您的 DB2 数据库表中提取。在为 ItemWriter 发出适当的对象之前,您可以在此处执行任何其他必要的处理,然后在 SQL Server 数据库表中插入或更新必要的记录。

    下面是一个项目示例,我使用ItemReader<Integer> 作为驱动查询来收集我需要在其上处理配置数据的设备的 ID。然后我将这些 ID 数据传递给我的 ItemProcessor,它一次处理一个配置文件:

    public class DeviceConfigDataProcessor implements ItemProcessor<Integer,DeviceConfig> {
    
        @Autowired
        MyJdbcDao myJdbcDao;
    
        @Override
        public DeviceConfig process(Integer deviceId) throws Exception {
    
            DeviceConfig deviceConfig = myJdbcDao.getDeviceConfig( deviceId );
            // process deviceConfig as needed
            return deviceConfig;
        }
    }
    

    您可以将deviceId 替换为code,并将DeviceConfig 替换为适合您项目的任何域对象。

    如果你使用的是Spring Boot,你应该自动有一个ConnectionPool,你的DAO会一次拉一条记录进行处理,所以你不用担心持久连接到数据库,悲观锁等。

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 2020-11-25
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2016-09-17
      • 2023-03-25
      • 2018-02-05
      • 1970-01-01
      相关资源
      最近更新 更多