【问题标题】:Spring + Atomikos batch insert/updateSpring + Atomikos 批量插入/更新
【发布时间】:2023-03-14 17:42:01
【问题描述】:

我设法将 spring + atomikos 配置为跨多个数据库进行全局事务,例如,以事务方式更新或插入记录。我一直在使用 @Transactional 注释和 SqlUpdate 或 BatchSqlUpdate 类来执行数据库事务。这是一个代码示例:

@Transactional
public void insertBatchIntoT1(List<Integer> ids, List<String> names) {
    Map<String, Object> params = new HashMap<>();
    for (int i = 0; i < ids.size(); i++) {
        int id = ids.get(i);
        String name = names.get(i);
        params.put("id", id);
        params.put("name", name);
        for (BatchSqlUpdate u : insertIntoT1)
            u.updateByNamedParam(params);
    }
    for (BatchSqlUpdate u : insertIntoT1)
        u.flush();
}

该方法采用 id 和名称列表(也可以是自定义 POJO 列表),并且对于列表中的每个项目,它设置为每个 DataSource 对象定义的每个批量更新中的参数(使用定义的准备好的语句在初始化时)并对每个执行更新。然后为每个 DataSource 刷新 BatchSqlUpdate。 我想知道这是否可以以不同的方式完成:是否可以在不触发提交的情况下将记录增量添加到 BatchSqlUpdate?例如,我希望能够定义三个方法:startBatchUpdate()、addToBatch(int id,String name) 和 flushBatch(),并且在第一个和第三个方法调用之间有一个事务。我尝试使用 Propagation.REQUIRED 属性,但它似乎没有解决问题。有任何想法吗? 我希望我的问题很清楚! 谢谢

【问题讨论】:

  • 嗯。看起来你想要的是 XA 协议,也就是 2 阶段提交:en.wikipedia.org/wiki/Two-phase_commit_protocolatomikos.com/Documentation/WhatIsXa
  • 不,这是我已经在使用的(根据 Transactional 注释)。我只是想知道是否可以避免传递列表的需要。到目前为止,我发现的唯一解决方案是将记录存储在缓冲区中,然后在批处理完成时调用一个事务方法,该方法从缓冲区获取数据并提交更新/插入。

标签: spring batch-processing jta atomikos


【解决方案1】:

是什么阻止您提取这 3 个方法并从 insertBatchIntoT1 中调用它们?

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2014-06-22
    • 2014-01-16
    • 2011-09-11
    相关资源
    最近更新 更多