MyBatis批量插入数据优化,增加一个参数,效率提升百倍

这篇具有很好参考价值的文章主要介绍了MyBatis批量插入数据优化,增加一个参数,效率提升百倍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目中进行接口压测,发现批量插入的速度有点超出预期,感觉很奇怪,经过定位后发现mybatise-plus批量保存的处理十分缓慢,使用的是saveBatch方法,这点有点想不通。于是就进行了相关内容分析。

根据mybatise-plus中saveBatch的方法进行源码查看:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

 

继续跟踪逻辑,从代码上看,确实是一条条执行了sqlSession.insert(sqlStatement, entity) 方法。

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库 继续跟踪,下面的consumer执行的就是上面的sqlSession.insert方法:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

具体执行逻辑中是累计到 一定数量后,一批数据进行flush。

其实,从上述的代码实现上看,整个实现机制跟我们预想的差不多,基本上是批量的实现思路。这种批量的处理肯定比一条条的insert要快。

但是,为什么还是如此的缓慢。

下面我们就进行一个粗略的实验,来对比一波。现在使用4种方式进行比较:

1、批量数据单条执行,调用myBatise方法save

2、批量执行调用myBatise方法saveBatch

3、通过xml手写sql批量插入

4、JDBC方式批量插入开始进行实验

1、1000条数据,一条条的插入

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库 

执行结果为:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

可以看到,执行一批1000条点的数据,耗费时间为1173毫秒。

2、1000条数据,使用mybatise-plus的saveBatch插入

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

执行结果为:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

 可以看到,本次总的耗时为289毫秒,比一条条的插入快了大约4倍,效率还是可以的。

3、通过xml手写sql批量插入。

Xml中拼接内容为:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

Java代码内容为:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

执行程序看下性能如何:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

本次耗时只有34毫秒,性能比saveBatch提高了7倍

4、JDBC方式批量插入开始进行实验

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

执行情况:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

本次耗时142毫秒,

执行效率比saveBatch要快,比手动拼接方式要慢,

综上所述,手动拼接sql的方式是批量保存效率最佳。

5、结论

整个执行结果跟预期的不一样,这里我们直接说结论,因为mybatise-plus的saveBatch方法会继续调用mysql驱动中的实现,

在Mysql的驱动jar中,ClientPreparedStatement.java中executeBatchInternal()方法中

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

就是这个叫 rewriteBatchedStatements 的属性,从名字来看是要重写批操作的 Statement,前面batchHasPlainStatements 已经是 false,取反肯定是 true,所以只要这参数是 true 就会进行一波操作。

属性默认是 false。

可以直接将 jdbcurl 加上了这个参数:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

看下 executeBatchedInserts 究竟干了什么,在上面基础上继续执行逻辑,

果然,sql语句倍rewrite了:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

对于插入而言,所谓的rewrite其实就是将一批插入拼接成insert into XXX values(a),(b)…

这样的一条语句形式后再执行,这样一来跟拼接sql的效果是一样的。

那么,为什么默认不给这个rewriteBatchedStatements属性设置为true,

原来有如下原因:

看下 executeBatchedInserts 究竟干了什么:

1.     如果批量语句中的某些语句失败,则默认重写会导致所有语句都失败。

2.     批量语句的某些语句参数不一样,则默认重写会使得查询缓存未命中。

看起来影响不大,所以我给我的项目设置上了这个参数!

最后我稍微总结下粗略的对比:大家如果想要更准确的实现,可以自己进行更多组数据测试:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

以如果有使用 jdbc 的 Batch 性能方面的需求,要将 rewriteBatchedStatements 设置为 true,这样能提高很多性能。

然后如果喜欢手动拼接 sql 要注意一次拼接的数量,分批处理。

以上为全部内容。

欢迎关注10W+的微信公众号:

mybatis每次提交1000条数据,Java架构师基础技术体系,mybatis,java,数据库

技术难点欢迎咨询,如有需要加我微信:1106915848。

星光不问赶路人,时光不负有心人文章来源地址https://www.toymoban.com/news/detail-606178.html

到了这里,关于MyBatis批量插入数据优化,增加一个参数,效率提升百倍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mybatis批量插入数据list超过一定长度时报错的解决办法(批量插入数据,数据过多时报错解决和批量修改报错

    在使用MyBatis进行批量新增时,如果数据量较大,可以考虑分批次插入以减少数据库的负载压力。这里提供一种基于MyBatis的分批次插入的方法: 创建一个新的Mapper XML文件(例如:BatchInsertMapper.xml)来定义批量插入的SQL语句。在该XML文件中,添加如下内容:   请将上述代码中

    2024年02月16日
    浏览(50)
  • 批量插入或更新数据(MyBatis-plus框架)

    目录 1.场景说明 2.DUPLICATE 和REPLACE比较 3.批量插入或者更新(两种方式) 方式一:mybatis-plus的saveOrUpdateBatch方法 问题:如果操作类集成了基础类,比如封装了BaseEntity去集成,那么这样使用会出问题 方式二:on duplicate key (推荐) 4.注意 5.常见问题  插入数据时,我们经常会遇到这

    2024年02月04日
    浏览(80)
  • SpringBoot+MyBatis批量插入数据的三种方式

    最近导入表格数据时需要同时插入修改大量数据,研究了一下有三种实现方式 1、用for循环调用sql插入数据 这种方式插入大量数据时,效率非常底下,不推荐 2、利用mybatis的foreach来实现循环插入 这种方式插入大量数据时,好处是不用频繁访问数据库,一条sql搞定,效率比较

    2024年02月16日
    浏览(40)
  • mybatis批量插入数据导致系统OOM,微服务内存爆了

    今天我们来说说工作中遇到的一个真实案例,由于使用mybatis的批量插入功能,导致系统内存溢出OOM(Out Of Memory), \\\"java.lang.OutOfMemoryError: Java heap space\\\"的报错,导致服务出现短暂的服务不可用,大概一两分钟不可用。这其实是个非常危险的故障,可能在高峰期导致整个系统瘫

    2024年02月01日
    浏览(46)
  • MySQL---使用索引优化、大批量插入数据优化

    1. 使用索引优化 索引是数据库优化最常用也是最重要的手段之一 , 通过索引通常可以帮助用户解决大多数的 MySQL 的性能优化问题: 1.1 避免索引失效应用-全值匹配 该情况下,索引生效,执行效率高。 1.2 避免索引失效应用-最左前缀法则 1.3 避免索引失效应用-其他匹配原则

    2024年02月07日
    浏览(51)
  • java 批量插入千万条数据优化方案【值得收藏】

    再实际开发应用中总会面临导入大批量数据插入数据库、数据迁移、同步等操作在java 后台执行,执行效率的优化问题随之而来!比如如何 快速往MySQL数据库中导入1000万数据 2、MySQL中新建一张user表,为了方便演示只保留id、昵称、年龄3个字段,建表语句; 3、再次打开pom.x

    2023年04月23日
    浏览(40)
  • Mybatis批量更新数据及其优化

    需求场景 :定时任务中,从其他平台同步数据,并更新当前平台数据库,表数据3W+,分批更新某个字段,耗时巨大,约30min,尝试性能优化。 批量更新的几种常见方式: 1.foreach 循环 在mybatis的xml文件中,使用foreach动态标签拼接SQL语句,每一条数据的更新语句对应一条update语

    2024年02月10日
    浏览(36)
  • MySQL——插入加锁/唯一索引插入死锁/批量插入效率

    本篇主要介绍MySQL跟加锁相关的一些概念、MySQL执行插入Insert时的加锁过程、唯一索引下批量插入可能导致的死锁情况,以及分别从业务角度和MySQL配置角度介绍提升批量插入的效率的方法; 在介绍MySQL执行插入的加锁过程之前,先复习下几种跟锁相关的概念; 快照读 InnoDB 利

    2024年02月12日
    浏览(36)
  • mysql 批量数据插入很慢(kettle 输入输出组件) 性能优化办法

    背景 最近在做数仓重构项目,遇到一些性能瓶颈,这里记录一下解决办法。 随着业务数据每天都在增加,几年前开发的etl任务开始跑不动了。大表一般是通过增量的方式插入,但是修复bug 或者每月/季度跑一次的情况 需要跑全量,原来的etl任务可能需要跑几个小时,甚至出

    2024年01月17日
    浏览(42)
  • Golang使用CopyIn进行批量创建,提高插入效率

    本文介绍两点: 如何在golang中使用copyin 如何对特殊字符jsonb进行插入(需要显式强制转化为string类型)

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包