すのはら荘春原庄的雪

mybatis实现数据库批量插入

Toretto·2022-12-28 15:53·1227 次阅读

mybatis实现数据库批量插入

1、前言

当入参参数是一个list时,可以使用循环进行依次插入,这是比较简单得一种方法,当然,缺点也比较明显,就是插入速度比较慢,如果llist 中存在一万条数据,也就是说,需要进行循环一万次,进行一万次得insert,效率也会大打折扣。这时可以使用mybatis中得批量插入,一次性插入多条数据,在速度上会好很多

2、实现

xml文件

复制代码
 1     <insert id="userList" 
 2         insert into tb_user (
 3         username,
 4         password
 5         )
 6         values
 7         <foreach collection="userList" item="user" separator=",">
 8             (
 9             #{user.username},
10             #{user.password},
11             )
12         </foreach>
13     </insert>
复制代码

mapperr文件

int userList(@Param("userList") List<User> userList);

这边需要注意一下

mapper文件中 @paramsz中的参数需要和xml文件中forEach中的collection的参数相同,否则会抛出找不到参数的报错

3、mysql批量插入受参数配置限制的问题 max_allowed_packet

当批量插入数据量多大时,超过mysql默认的最大入参量,会抛出异常 :

             \n### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (8,739,623 > 4,194,304)

由于mysql默认最大限制是4M(1024 * 1024 * 4),当大于这个阈值时,自然会报错

键入命令查看最大存储的量   show VARIABLES like '%max_allowed_packet%';

 

我这边是已经设置到64M了

 

常用的有这两种方法可以解决

1、修改配置文件

win系统下打开你的mysql的安装包路径,和bin同级可以看到有一个my.ini文件,在文件尾部加上  max_allowed_packet =67108864 即可

,linux 上一般都放在都放在 /etc/my.cnf 这个路径下,操作和win类似,使用ssh连接服务器之后 键入命令行 “Nano /etc/my.cnf” 即通过nano浏览my.cnf文件,在文件尾部加上max_allowed_packet =67108864 即可

修改完文件之后需要重启mysql服务才可以生效

2、命令行窗口键入(即使生效)

打开命令窗口 键入 mysql> set global max_allowed_packet = 1024 * 1024 * 500;

 

还可以使用Stream流将list进行分页存储,不过这种情况只适用于数据大小一致的情况下,可以判断list是否大于你设置的阈值

                    List<user> subList = list.stream().skip((long) (ipageNo- 1) * pageSize).limit(pageSize)
                            .collect(Collectors.toList());

 

4、小结

具体修改每次插入多大M,还请各位根据自己得服务器得配置自行配置

配置文件设置过大的话,可能会影响插入的性能,修改配置文件这种事,还需慎重

设置为500M,也可能会崩溃掉,但是这种情况一般不会发生,毕竟,插入数据能够一次输入500M还是在少数

posted @   Μikey  阅读(1228)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示