mybatis批量插入5W条数据,三种方式效率对比

测试代码

 List<BaseOrg> baseOrgList = new ArrayList<>();

        SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
        OrgMapper um = session.getMapper(OrgMapper.class);
        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 50000; i++) {
            BaseOrg baseOrg = new BaseOrg();

            baseOrg.setOrgid(String.valueOf(i));
            baseOrg.setJb(0);
            baseOrg.setOrgcode(i + "1");
            baseOrg.setOrgname(i + "1");
            baseOrg.setOrgpid(i + "1");
            baseOrg.setIOrder(i + "1");
            baseOrg.setMinistriesname(i + "1");
            baseOrg.setOrgRootid(i + "1");
            baseOrg.setOrgtype(i + "1");
            baseOrg.setIsLeaf("1");
            baseOrg.setOrgnature(i + "1");
            baseOrg.setKeyTrades("");
            baseOrg.setProvince(i + "1");
            baseOrg.setOrgGuid(i + "1");
            baseOrg.setCreateUserid(i + "1");
            baseOrg.setCreateTime(new Timestamp(System.currentTimeMillis()));
            baseOrg.setUpdateUserid(i + "1");
            baseOrg.setUpdateTime(new Timestamp(System.currentTimeMillis()));
            baseOrg.setCreateUserorg(i + "1");
            baseOrg.setUpdateUserorg(i + "1");

            baseOrgList.add(baseOrg);
        }

        // 一:将baseOrgList拆分1000条执行一次   55981ms
        if (baseOrgList.size() < 1000) {
            dBOrgMapper.insertOrgVOList(baseOrgList);
        } else {
            int insertTimes = (int) Math.ceil(baseOrgList.size() * 1.0 / 1000);
            for (int i = 0; i < insertTimes; i++) {
                dBOrgMapper.insertOrgVOList(baseOrgList.subList(1000 * i, Math.min(1000 * (i + 1), baseOrgList.size())));
            }
        }

        // 二:使用google的guava工具包下的Lists.partion方法,分片,分批次1000条执行,其实和上边那个一样   89949ms
        List<List<BaseOrg>> partitionList = Lists.partition(baseOrgList, 1000);
        for (List<BaseOrg> orgList : partitionList) {
            dBOrgMapper.insertOrgVOList(orgList);
        }

        // 数据库配置添加 &rewriteBatchedStatements=true,使用ExecutorType.BATCH,这样前前后后就只用这一个 SqlSession   4604ms
        for (BaseOrg baseOrg : baseOrgList) {
            um.insertOrgVO(baseOrg);
        }
        session.commit();

        long endTime = System.currentTimeMillis();
        logger.info("一条条插入 SQL 耗费时间 {}", (endTime - startTime));

方式一:

// 一:将baseOrgList拆分1000条执行一次   55981ms
if (baseOrgList.size() < 1000) {
    dBOrgMapper.insertOrgVOList(baseOrgList);
} else {
    int insertTimes = (int) Math.ceil(baseOrgList.size() * 1.0 / 1000);
    for (int i = 0; i < insertTimes; i++) {
        dBOrgMapper.insertOrgVOList(baseOrgList.subList(1000 * i, Math.min(1000 * (i + 1), baseOrgList.size())));
    }
}

方式二:

// 二:使用google的guava工具包下的Lists.partion方法,分片,分批次1000条执行,其实和上边那个一样   89949ms
List<List<BaseOrg>> partitionList = Lists.partition(baseOrgList, 1000);
for (List<BaseOrg> orgList : partitionList) {
    dBOrgMapper.insertOrgVOList(orgList);
}

方式三:

// 开启数据库配置&rewriteBatchedStatements=true
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
OrgMapper um = session.getMapper(OrgMapper.class);
// 数据库配置添加 &rewriteBatchedStatements=true,使用ExecutorType.BATCH,这样前前后后就只用这一个 SqlSession   4604ms
for (BaseOrg baseOrg : baseOrgList) {
	um.insertOrgVO(baseOrg);
}
session.commit();
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值