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

学吧。学无止境啊

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值