Mybatis批量插入不同表数据

背景

定时任务拉取4000条数据, 每条数据对应一张不同的表;即4000条数据对应4000张表

方案

  • 使用自定义 ExecutorType
    默认情况下,MyBatis 会为每个 SQL 语句生成一个新的 PreparedStatement,这会导致大量的开销。通过将 ExecutorType 设置为 BATCH,可以将多条语句合并为一个批处理,大幅减少网络交互次数。

代码

@Autowired
private SqlSessionFactory sqlSessionFactory;

public void batchInsert(List<MyData> dataList) {
    try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
        MyMapper mapper = sqlSession.getMapper(MyMapper.class);
        for (int i = 0; i < dataList.size(); i++) {
            mapper.insert(dataList.get(i));
            if (i % BATCH_SIZE == 0) {
                sqlSession.flushStatements();
            }
        }
        sqlSession.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

效果

BATCH_SIZE 设置为1000, 数据库为TDengine2.0. 5秒完成4000条数据入库;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值