MyBatis批量插入使用foreach循环插入的优化,使用分片多线程
在使用MyBatis进行批量插入数据时,我们常用的方法是在使用insert语句进行批量插入,这种方式在数据量比较少的时候,插入较快,但是当数据量较大的时候,不仅耗时,而且占用的CPU资源比较高。今天我们来对比说明一下,并在最后给出优化的方案。
先设计一张MySQL数据库,用来存储批量插入的数据,以插入用户信息为例,本次表在设计时多设计一些字段,在插入时的差异凸显的更加明显。
接下来我以插入50000条数据为例,由浅入深,分别从循环单条插入、批量插入等进行对比分析。 1、循环单条插入
模拟生成用户的姓名、手机号、身份证号码这些信息,避免因相同数据造成的缓存误差,然后逐条插入数据库中。
随机生成用户姓名:
随机生成11位手机号码:
随机生成身份证号码:
逐条插入用户数据的实现方法(使用JUnit进行单元测试),需要了解JUnit进行单元测试,可以访问上一篇文章SpringBoot框架集成JUnit单元测试:
插入完毕,查看控制台总耗时,以及数据库的数据入库情况:
执行总共耗时1634240ms,也就是27分钟左右。 2、使用foreach批量插入
在同等条件下进行测试验证,还是自动生成用户信息,封装成list,然后一次性插入。
这种方式相对于第一种方式,进行了提升,原理就是将
转换为
此时我们去执行程序发现,程序报错
如果我们将批量插入的50000条数据改成10000条,发现1秒左右就执行结束了。
从上面可以看出,使用foreach进行批量插入,原理上就是让多条insert into插入语句变成一条插入语句,可以带来性能上的提升,但同时也带来了两个问题:
(1)当插入的数据较多时,相当于拼接的sql语句会特别的长,甚至超过sql语句的长度,一旦超出,就会抛出异常导致无法插入。
(2)当插入的数据较多时,也比较耗时,针对这点官方也做了说明,这里我们就不做详细的拓展,我们继续讨论怎么解决这个问题。这里贴一张官方的说明截图。
这句话要表达的意思就是,当插入数量很多时,不能一次性全放在一条语句里。 3、使用foreach配合分片批量插入
既然不能封装成一条SQL,那我们考虑有没有其他的方式,当然有,可以采用分片的方式。
主要原理就是将list集合按"指定长度"进行切分,返回新的List>集合。
可以看出,50000条数据,不到2秒钟就插入完成,大大提高了效率。
这里分片的目的有两个:
1、批量插入,拼接的SQL语句过长,sql语句会有限制;
2、分片后采用stream多线程并行插入可以提高效率;
此外,不管是mysql还是oracle数据库,都可以使用分片进行插入。
在坐牢期间得了精神病疯了,还需要继续坐牢吗?在坐牢期间得精神病疯了,监狱会带你去往指定的医院先进行鉴定你是否真的疯了如果鉴定结论是真的患有精神类疾病,会给你变更刑事措施,依法变更为保外就医或监视居住。因为你违法了,本该受到惩
为什么很多人失业了,却拿不到失业金呢?中国人口太多,无业可就,中年失业叫下岗,青年失业叫待业。没有失业就不可能有失业金。用人单位及劳动者缴纳失业保险金一年以上,失业后符合下列条件的,才能领取失业保险金。一是非因本人意愿
江西夫妇因燃气热水器而意外去世,给了我们什么样的反思?江西夫妇因燃气热水器而意外去世,留下了8个未成年的孩子,虽说在有关部门的关爱下,每个孩子每月有了1200元的救助金,有了伯父伯母及奶奶的照顾与监护,长大成人只是时间问题了,但是留给
独居生活到底有多可怕?独居生活到底有多可怕?独居生活没有什么可怕的,本人62岁独居10多年。性格内向孤僻的原因觉得一个人生活很好是事自己做主。日常生活非常随意,不需要为另一半着想。只要照顾好自己,这个家
父母没有退休金,孩子找对象受歧视吗?我告诉我儿子找对象时一定达到这几个条件独生女,有稳定工作,父母有退休金,原生家庭,个子高。孩子说我的条件多,我老公给孩子说了,我们不扶贫也不高攀,门当户对即可。因为当初我们两口子是
死刑犯在监狱里,普通犯人再牛也要避让三分,为什么?死刑犯在监狱里,普通犯人再牛也要避让三分,为什么?犯罪嫌疑人被公安机关刑事拘留或逮捕后,移送人民检察院起诉人民检察院审查后移送人民法院审判。初审人民法院判处被告人死刑立即执行终审人
有人说农民没交养老保险,所以不能给养老金养老,你怎么看?这种老掉牙的问题提过八百遍了,按法律政策办就完了。想吃白食不劳而获耍赖碰瓷的机会几乎为零。总想着天上掉馅饼的事儿?城镇国企下岗工人,自己不缴纳养老保险金,一样没有退休金。那还能咋看
蜜蜂能坚持6个月不排便,人能坚持多久?2个真实案例证明人能坚持更久,英国一个男人憋了47天,美国一个男人憋了整整3年,创下了吉尼斯世界纪录。案例一在英国,有一名男子在运送毒品的时候,为了躲避检查,把毒品严密包裹之后吃进
我52岁改嫁,如今二婚老伴去世,子女和继子女,我该找谁养老?你感觉找谁可以养老?抛夫弃子20多年了,你在那生活好好的。就因为后夫去世了,你想回去能说得过去吗?52你改的嫁,相比后夫的孩子都成成年人了,之所以你能在那过下去,是因为老头子感觉有
麦当劳响应国家号召,开始招聘退休老人。你会去应聘吗?这是我的亲身经历,我是一个退休人员。首先去面试,很融洽,面试合格。下面需要准备一下材料1需要体检报告合格,健康证需要花大约200元,2买裤子蓝色的,鞋防滑的,俗称肯德基鞋。制装费。
农村老人没有养老金,只能靠子女养活吗?不靠儿女,还想靠谁?难不成要别人替你儿女接盘吗?每个人都有自己的父母,每个人都要赡养自己的老人。农村老人能拒绝养老保险丶是因为有宅基地丶菜园丶耕地,农民可以享受补贴和基础养老金,自