首页 > 作文

MyBatis批量插入大量数据(1w以上)

更新时间:2023-04-04 10:25:39 阅读: 评论:0

问题背景:只用mybatis中foreach进行批量插入数据,一次性插入超过一千条的时候mybatis开始报错。项目使用技术:springboot、mybatis

批量插入碰到的问题:

java.lang.stackoverflowerror: null

该问题是由于一次性插入数据1w条引起的,具体插入代码如下:

urdao.batchinrt(list);<inrt id="batchinrt" parametertype="java.util.list">  inrt into ur  <trim prefix="(" suffix=")" suffixoverrides=",">    id, age, name, email  </trim>  lect a.*  from  (<foreach collection="list" index="index" item="item" parator="union all">  lect  sys_guid(), #{ur.age}, #{ur.name}, #{ur.email}  from dual</foreac立志歌曲h>) a</inrt>

以上的插入代码其实也是一种批量插入的方式,但是他的灵界点并不高,插入数据过多的时候,可能需要我们使用代码在一次分批。当然如果插入数据不超过5000的时候可以直接这么使用

插入1w条数据,发现出现错误,原因是数据量过大,栈内存溢出了。mybatis中直接使用foreach插入数据,就相当于将所有的sql预先拼接到一起,然后一起提交。这本身就是一种批量插入的处理方案,但是达不到我们要求。主要是插入有上限。如果需要更多的数据导入,我们需要更换一种方式来解决这个问题,mybatis中executortype的使用。

mybatis中executortype的使用

mybatis内置的executortype有3种,simple、reu、batch; 默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优;但batch模式也有自己的问题,比如在inrt操作时,在网络教育文凭有用吗事务狼与小羊没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的;

插入大量数据的解决方案,使用executortype

为了能够高效,并且解决上述问题,我们使用executortype,并分批插入。代码如下:

//我们使诗歌的表现手法有哪些用的是springboot,sqlssiontemplate是可以自己注入的@autowiredprivate sqlssiontemplate sqlssiontemplate;public void inrtexceldata(list<ur> list) {  //如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出  sqlssion ssion = sqlssiontemplate.getsqlssionfactory().openssion(executortype.batch, fal);  //不自动提交  try {    urdao urdao = ssion.getmapper(urdao.class);    for (int i = 0; i < list.size(); i++) {      urdao.inrt(list.get(i));      if (i % 400 == 0 || i == list.size() - 1) {        //手动每400条提交一次,提交后无法回滚        ssion.commit();        //清理缓存,防止溢出        ssion.clearcache();      }    }  } catch (exception e) {    //没有提交的数据可以回滚    ssion.rollback();  } finally {    ssion.clo();  }}urdao.inrt(ur ur);<inrt id="inrt" parametertype="com.echo.urpo">  inrt into ur  (id  <if test="age != null">    ,age  </if>  <if test="name != null">    ,name  </if>  <if test="email != null">    ,email  </if>  )  values (  sys_guid()  <if test="ag满族服饰e != null">    ,#{age}  </if>  <if test="name != null">    ,#{name}  </if>  <if test="email != null">    ,#{email}  </if>)</inrt>

这里采用的是单条插入,直接使用for循环,但是使用executortype.bacth就相当于手动提交。这也是我们需要的效果,所以我们在循环里面判断了,是否到了第400笔,如果到了第400笔就直接提交,然后清空缓存,防止溢出。这样就有效的实现了批量插入,同时保证溢出问题的不出现

到此这篇关于mybatis批量插入大量数据(1w以上)的文章就介绍到这了,更多相关mybatis批量插入内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 10:25:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/2be51f0df7123bf318a6435c1d9bea91.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:MyBatis批量插入大量数据(1w以上).doc

本文 PDF 下载地址:MyBatis批量插入大量数据(1w以上).pdf

标签:数据   批量   的是   语句
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图