当前位置: 首页 > news >正文

天津品牌网站建设好处企业网页制作公司

天津品牌网站建设好处,企业网页制作公司,黄冈推广平台,wordpress扩展插件粗略的实验 最后 最近在压测一批接口的时候,我发现接口处理速度比我们预期的要慢。这让我感到有点奇怪,因为我们之前已经对这些接口进行了优化。但是,当我们进行排查时,发现问题出在数据库批量保存这块。 我们的项目使用了 myb…
  • 粗略的实验

  • 最后

 

最近在压测一批接口的时候,我发现接口处理速度比我们预期的要慢。这让我感到有点奇怪,因为我们之前已经对这些接口进行了优化。但是,当我们进行排查时,发现问题出在数据库批量保存这块。

我们的项目使用了 mybatis-plus 这个工具,而批量保存我们是直接使用的 mybatis-plus 提供的 saveBatch 方法。在仔细研究了这个方法后,我发现它并没有对批量插入进行优化,而是直接循环插入数据。

我点进去看了下源码,感觉有点不太对劲:

我继续追踪了下,从这个代码来看,确实是 for 循环一条一条执行了 sqlSession.insert,下面的 consumer 执行的就是上面的 sqlSession.insert: 

然后累计一定数量后,一批 flush。

从这点来看,这个 saveBach 的性能肯定比直接一条一条 insert 快。

我直接进行一个粗略的实验,简单创建了一张表来对比一波!

粗略的实验

1000条数据,一条一条插入

 

可以看到,执行一批 1000 条数的批量保存,耗费的时间是 121011 毫秒。

1000条数据用 mybatis-plus 自带的 saveBatch 插入

 

耗费的时间是 59927 毫秒,比一条一条插入快了一倍,从这点来看,效率还是可以的。

然后常见的还有一种利用拼接 sql 方式来实现批量插入,我们也来对比试试看性能如何。

1000条数据用手动拼接 sql 方式插入

搞个手动拼接:

 来跑跑下性能如何:

耗时只有 2275 毫秒,性能比 mybatis-plus 自带的 saveBatch 好了 26 倍!

这时,我又突然回想起以前直接用 JDBC 批量保存的接口,那都到这份上了,顺带也跑跑看!

1000条数据用 JDBC executeBatch 插入

 

耗时是 55663 毫秒,所以 JDBC executeBatch 的性能跟 mybatis-plus 的 saveBatch 一样(底层一样)。

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

但是我又不太甘心,总感觉应该有什么别的法子,然后我就继续跟着 mybatis-plus 的源码 debug 了一下,跟到了 mysql 的驱动,突然发现有个 if 里面的条件有点显眼:

 

 

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

我看了下默认是 false。

同时我也上网查了下 rewriteBatchedStatements 参数,好家伙,好像有用!我直接将 jdbcurl 加上了这个参数: 

 

然后继续跑了下 mybatis-plus 自带的 saveBatch,果然性能大大提高,跟拼接 SQL 差不多! 

顺带我也跑了下 JDBC 的 executeBatch ,果然也提高了。 

然后我继续 debug ,来探探 rewriteBatchedStatements 究竟是怎么 rewrite 的!

如果这个参数是 true,则会执行下面的方法且直接返回:

看下 executeBatchedInserts 究竟干了什么: 

看到上面我圈出来的代码没,好像已经有点感觉了,继续往下 debug。

果然!sql 语句被 rewrite了:

对插入而言,所谓的 rewrite 其实就是将一批插入拼接成 insert into xxx values (a),(b),(c)...这样一条语句的形式然后执行,这样一来跟拼接 sql 的效果是一样的。

那为什么默认不给这个参数设置为 true 呢?

原来是这样的:

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

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

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

 

最后

稍微总结下我粗略的对比(虽然粗略,但实验结果符合原理层面的理解),如果你想更准确地实验,可以使用JMH,并且测试更多组数(如 5000,10000等)的情况。

 

在处理 JDBC 的批量操作时,有两个性能方面的关键点。首先,需要注意将 rewriteBatchedStatements 设置为 true,以提高性能。其次,如果你倾向于手动拼接 SQL 语句,你需要注意一次拼接的数量并进行分批处理。此外,你也可以通过优化 SQL 查询语句的方式来提高性能。例如,使用索引、避免使用 select * 等操作,可以减少查询所需的时间和资源。还可以使用连接池来缓存数据库连接,减少每次建立连接的时间和成本。总之,通过细致地调整和优化你的数据库操作,你可以显著提高应用程序的性能和稳定性。 

 

 

http://www.yayakq.cn/news/161793/

相关文章:

  • 石林彝族网站建设扬州seo招聘
  • 顶呱呱网站做的怎么样深圳工程建设服务网
  • 需要前置审批的网站百度做网站需要多少钱
  • 宝安网站设计案例建站工具指北
  • 仙居住房和城乡建设局网站做网站反复修改
  • 淄博网站制作高端网络wordpress国内访问不了
  • 哪些网站可以做任务wordpress移除注册登录界面图标
  • 石家庄商城网站制作普通电脑如何做网站服务器吗
  • 西安优秀的集团门户网站建设费用镇江公交优化
  • 地方门户网站管理系统博客社区类网站模板下载
  • 网站开发的工作需要什么材料网络品牌营销案例
  • 免费做网站怎么做网站链接seo优化或网站编辑
  • 网站建设板块免费下载小程序微商城定制开发
  • 做网站用的浏览器有哪些益阳做网站公司
  • 做网站费华为网站开发
  • 常州公司网站模板建站wdcp搭建网站教程
  • 网站开发可以当程序员wordpress 关键词 插件
  • 网站建设物理架构网站开发技术方案doc
  • 淘宝网做宝贝详情用哪个网站深圳3d制作
  • 做货代的可以在哪些网站打广告做多语言网站教程
  • 网站建设 技术方案模板企业网
  • 网站怎样制作吸引人做网站算软件行业吗
  • 访问中国建设银行官方网站用asp做网站span
  • 网页设计购物网站建设北京系统开发
  • 网站建设设计文档模板咨询公司网站
  • 大连手机自适应网站建设公司住房和城乡建设部网站 绿地
  • 关于设计的网站有哪些网站投票系统 js
  • 怎样做网站xml网站管理员有哪些权限
  • 北京东城区 网站建设企业业务系统有哪些
  • 餐饮商城网站建设网站费用怎么做会计分录