大家好,欢迎来到IT知识分享网。
问题情况:
导入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
学吧。学无止境啊
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23596.html