关于mybatis使用foreach插入速度较慢的问题

文章探讨了在Mybatis中使用foreach批量插入数据时遇到的性能问题,指出随着插入数据量增加,解析foreach越慢。通过对比不同插入方式,如字符串拼接、批处理和存储过程,最终推荐使用MySQL的LOAD DATA LOCAL INFILE结合setLocalInfileInputStream方法,实现了从Java InputStream高效导入数据,显著提升了8000条数据的插入速度至0.214秒。
摘要由CSDN通过智能技术生成

使用mybatis批量插入,看了这篇博客

https://blog.csdn.net/m0_37981235/article/details/79131493

我这种懒货懒得想其中原因,直接上手第三种!

结果测试多次,发现我插入8000条数据,第一种方式只需要30秒不到,可是第三种方法却需要一分多钟。

不知道原作者是怎么实现的,可能和插入数据的多少有关,我这里是8个字段。测试后1000taio需要1.7秒,500条需要0.4秒,切割成100条100条的插入,最终8000条数据只需要1.4s.

查询资料得知

 Mybatis 在解析 foreach 的时候,因为需要循环解析 #{} 之类的占位符,foreach 的集合越大,解析越慢。

mybatis进行foreach的时候是没有缓存的,每次都得重新解析一下,所以越来越慢。

如果想要达到上图的程度,必须先解决foreach拼接问题

我没有找到好的办法。如果有大佬知道还请告知。

所以我可以java中使用字符串拼接的方式。

但是即使拼接成字符串之后,速度可能的确会很快,但是没办法在mybatis中引用。

例如

insert into tb_csp_baseDataAll (
        parentArea,
        area,
        committee,
        type,
        woman_name,
        woman_id_card,
        tel,
        wid
        ) values #{string}

这种传入的string就是字符串,带有的()是在字符串内的,可能

 类似于

insert into tb_csp_baseDataAll (
        parentArea,
        area,
        committee,
        type,
        woman_name,
        woman_id_card,
        tel,
        wid
        ) values "('a','b'...)"

数据库会报错,暂时没有找到好的办法解决。

如果使用存储过程的话,传入的值为为一个list是不大可能的,最理想的方法估计就是传一个json字符串,然后进行解析,似乎也是非常的麻烦,效率也不一定会很高。

使用批处理方式解决,8000条数据也是需要22秒左右。

最后查阅资料使用LOAD DATA LOCAL INFILE实现大批量插入:https://blog.csdn.net/baidu_38083619/article/details/83378885

MySQL使用LOAD DATA LOCAL INFILE从文件中导入数据比insert语句要快,MySQL文档上说要快20倍左右。
但是这个方法有个缺点,就是导入数据之前,必须要有文件,也就是说从文件中导入。这样就需要去写文件,以及文件删除等维护。某些情况下,比如数据源并发的话,还会出现写文件并发问题,很难处理。
那么有没有什么办法,可以达到同样的效率,直接从内存(IO流中)中导入数据,而不需要写文件呢?


MySQL社区提供这样一个方法:setLocalInfileInputStream(),此方法位于com.mysql.jdbc.PreparedStatement 类中。通过使用 MySQL JDBC 的setLocalInfileInputStream 方法实现从Java InputStream中load data local infile 到MySQL数据库中。

package com.akb.hfcx.csp.utils;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值