Mysql中大数据的批量插入方法比较

Mysql中大量数据的批量插入方法比较

模型类:
public class Student {
    private int age;
    private String name;
    private boolean sex;
}
方法一:循环单条插入
xml中的插入语句:

<insert id= "insert">
	insert into user (name ,age, sex) values (name, age, sex)
</insert>

service类: 

Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;

public void add(List<Student> itemList) {
    itemList.forEach(StudentMapper::insert);
}

当插入大量数据时,效率极低(不建议使用)
方法二:循环插入多条,拼接sql
xml中的插入语句:

<insert id="insertByBatch" parameterType="java.util.List">
   insert into user (age, name, sex)
    <foreach collection="list" item="item" index="index" separator=",">
      (#{item.age}, #{item.name}, #{item.sex}) 
    </foreach>
</insert>
service类: 

public void add(List<Student> itemList) {
    itemList.forEach(StudentMapper::insertBatch);
}

插入大量数据时,效率尚可,当数据量过于庞大,拼接的sql会很长,由于单条sql的语句有大小限制,所以可能插入失败(推荐数据量不是太大使用)
方法三:mybatis ExecutorType.BATCH批处理执行
Service类:

在batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 
但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的

public void add(List<Student> itemList) {

    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
    // 新获取一个模式为BATCH,自动提交为false的session
    // 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
    SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
    StudentMapper mapper = session.getMapper(StudentMapper.class);
        for (int i = 0; i < itemList.size(); i++) {
            mapper.insert(itemList.get(i));
            if(i%1000==999){//每1000条提交一次防止内存溢出
                session.commit();
                session.clearCache();
            }
        }
        session.commit();
        session.clearCache();
}
插入大量数据时,效率最高, 通过重复使用预编译后的语句,不断填充数据,批量提交(数据量很大使用)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值