栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis 批量插入速度慢

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis 批量插入速度慢

 问题情况:

导入400个Excel 

每个Excel5000条数据

需要对Excel 进行小范围处理  插入三张表

原同事进行简单嵌套多层循环进行判断

因为需要副表主键进行主表关系绑定

由原来同事代码的简单嵌套循环升级为  预分配主键  进行主表附表的同时批量插入

避免多次单个插入附表等待主键返回以及数据库连接问题

操作完所有数据后用时三十小时

时间长原因分析:

主表未进行真正批量插入

解决方案一:

mysql连接增加参数  rewriteBatchedStatements=true

表示允许mysql进行批量插入

此参数默认为关闭状态,说会因为返回主键或其他造成未知错误。具体原因未深究

设置后发现插入任不是真正批量插入,依然是由循环单个sql进行插入

查看打印的sql发现多次sql的参数不一致

因参数个数不一致会造成mybatis无法解析,会使用循环插入方式解决。

解决方案二:

给所有参数设置默认值

给主表的无参构造函数设置所有默认值,在Excel对象与数据库bean对象进行拷贝时,除了读出的数据其他均保留为默认值

此举作用:让插入语句拥有统一的参数个数和顺序

让mybatis可以使用  insert into table () values ()()()()()()  的语句形式

从而实现真正的批量插入

达到  几千条/秒

当两百万数据插入完成后,进入数据库清理默认数据

update table  set a = null where a = 'defaultcvalue'

 中间优化了一些小表的小几万数据 放入内存通过map进行缓存  减少了400 * 50000 * 小表数量  的次数循环

最终插入加清理 两百万简单处理的数据 用时一个小时左右 

若使用  多线程 可能耗时更短  但是因为使用了预分配主键的问题,不想在保证数据一致性上在花费功夫   就这样吧   累了

总结:mybatis 和 mybaits plus  的批量插入需要保证 入参个数与顺序一致 否则即使打开了  rewriteBatchedStatements=true 参数也不会进行真正的批量插入

物理多线程:甚至可以使用两台计算机同时执行相同的流程的多线程方式     hhhhhhhh

学吧。学无止境啊

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016789.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号