一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Mybatis Plus很好,但也有坑!

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-11-27 16:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


最近在開(kāi)發(fā)一個(gè)后臺(tái)發(fā)送消息的功能時(shí),由于需要給多個(gè)用戶發(fā)送消息,于是使用了 mybatis plus 提供的 saveBatch() 方法,在測(cè)試環(huán)境測(cè)試通過(guò)上預(yù)發(fā)布后,測(cè)試反應(yīng)發(fā)送消息接口很慢得等 5、6 秒,于是我就登錄線上環(huán)境查看執(zhí)行日志,發(fā)現(xiàn)是 mybatis plus 提供的 saveBatch() 方法執(zhí)行很慢導(dǎo)致,于是也就有了本篇文章。

mybatis plus 是一個(gè)流行的 ORM 框架,它基于 mybatis,提供了很多便利的功能,比如代碼生成器、通用 CRUD、分頁(yè)插件、樂(lè)觀鎖插件等。它可以讓我們更方便地操作數(shù)據(jù)庫(kù),減少重復(fù)的代碼,提高開(kāi)發(fā)效率。

案發(fā)現(xiàn)場(chǎng)還原

/**
*先保存通知消息,在批量保存用戶通知記錄
*/
@Transactional(rollbackFor=Exception.class)
@Override
publicbooleansaveNotice(Notifynotify,StringreceiveUserIds){
longbegin=System.currentTimeMillis();
notify.setCreateTime(newDate());
notify.setCreateBy(ShiroUtil.getSessionUid());
if(notify.getPublishTime()==null){
notify.setPublishTime(newDate());
}
booleaninsert=save(notify);
Listcollect=newArrayList<>();
ListreceiveUserList=fillNotifyRecordList(notify,receiveUserIds,collect);
notifyRecordService.saveBatch(collect);
longend=System.currentTimeMillis();
System.out.println(end-begin);
...
returninsert;
}

/**
*根據(jù)用戶id,組裝用戶通知記錄集合,返回200條記錄
*/
publicListfillNotifyRecordList(Notifynotify,StringreceiveUserIds,Listcollect){
ListnoticeRecordList=newArrayList<>(200);
...
//組將兩百條用戶通知記錄
returnnoticeRecordList;
}

如上代碼,我有一個(gè) saveNotice() 方法用于保存通知消息以及用戶通知記錄。執(zhí)行邏輯如下,

  1. 保存通知消息
  2. 根據(jù)用戶 id,組裝用戶通知記錄集合,返回 200 條用戶通知記錄
  3. 批量保存用戶通知記錄集合

前兩步驟耗時(shí)都很少,我們直接看第三步操作耗時(shí),結(jié)合 sql 執(zhí)行日志,如下,

--slowsql5542millis.INSERTINTOoa_notify_record(notifyId,receiveUserId,receiveUserName,isRead,createTime)VALUES(?,?,?,?,?)[225,"fcd90fe3990e505d07c90a238f75e9c1","niuwawa",false,"2023-10-302304"]
5681

再結(jié)合 mybatis free log 插件打印完整 sql 如下圖,

321d25c6-8cc5-11ee-939d-92fbcf53809c.png

可以看出,我們批量保存用戶通知記錄是一條記錄一條進(jìn)行保存得,已經(jīng)可以猜測(cè)就是批量插入方法導(dǎo)致得耗時(shí)較高。

這里使用得是 mybatis log free 插件,它可以自動(dòng)幫我們?cè)诳刂婆_(tái)打印完整得 mybatis sql 語(yǔ)句。有需要可以在 idea 插件中心搜索 mybatis log free 下載安裝。

結(jié)合 saveBatch() 底層源碼也能夠看出,mybatis plus 對(duì)于批量操作是通過(guò) for 循環(huán)執(zhí)行保存操作得,源碼如下圖,

322e80aa-8cc5-11ee-939d-92fbcf53809c.png

到這里我們也就知道了在測(cè)試環(huán)境執(zhí)行較快得原因,因?yàn)樵跍y(cè)試環(huán)境需要批量保存得用戶通知記錄比較少,只有幾條記錄,所以很快。但是上預(yù)發(fā)布后,由于預(yù)發(fā)布中需要批量保存得用戶通知記錄比較多達(dá)到了數(shù)百條,所以執(zhí)行較慢,耗時(shí)達(dá)到了 5、6 秒之久。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

解決方法

到這里,也就是本文得重點(diǎn)所在了,那怎么解決這個(gè)問(wèn)題嘞?如何既利用 mybatis plus 提供得便攜性,也能夠解決批量操作耗時(shí)較高得問(wèn)題。

其實(shí)解決方法很簡(jiǎn)單,只需要在 jdbcurl 上添加 rewriteBatchedStatements=true 參數(shù)即可解決這個(gè)問(wèn)題。

MySQL 的 JDBC 連接的 url 中要加 rewriteBatchedStatements 參數(shù),并保證 5.1.13 以上版本的驅(qū)動(dòng),才能實(shí)現(xiàn)高性能的批量插入。

MySQL JDBC 驅(qū)動(dòng)在默認(rèn)情況下會(huì)無(wú)視 executeBatch()語(yǔ)句,把我們期望批量執(zhí)行的一組 sql 語(yǔ)句拆散,一條一條地發(fā)給 MySQL 數(shù)據(jù)庫(kù),批量插入實(shí)際上是單條插入,直接造成較低的性能。只有把 rewriteBatchedStatements 參數(shù)置為 true, 驅(qū)動(dòng)才會(huì)幫你批量執(zhí)行 SQL。另外這個(gè)選項(xiàng)對(duì) INSERT/UPDATE/DELETE 都有效。

rewriteBatchedStatements=true 的意思是,當(dāng)你在 Java 程序中使用批量插入/修改/刪除(batching)時(shí),MySQL JDBC 驅(qū)動(dòng)程序?qū)L試重新編寫(xiě)(rewrite)你的 SQL 語(yǔ)句,以便更有效地執(zhí)行這些批量插入操作。

OK,在我們給 jdbcurl 上添加了參數(shù)后,看看效果,如下圖,

325f6e2c-8cc5-11ee-939d-92fbcf53809c.png

可以看到 jdbcurl 添加了 rewriteBatchedStatements=true 參數(shù)后,批量操作的執(zhí)行耗時(shí)已經(jīng)只有 200 毫秒,自此也就解決了 mybatis plus 提供的 saveBatch() 方法執(zhí)行耗時(shí)較高得問(wèn)題。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

總結(jié)

mybatis plus 給開(kāi)發(fā)人員帶來(lái)了很多便利,但是其中也有一些坑點(diǎn),比如上文所提到得批量操作耗時(shí)問(wèn)題,如果不注意的話,就有可能調(diào)入坑里,各位開(kāi)發(fā)同學(xué)可以檢查自己或者公司項(xiàng)目中 jdbcurl 是否缺失 rewriteBatchedStatements=true 參數(shù),加以改正,避免重復(fù)掉入這個(gè)坑里。



聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3927

    瀏覽量

    66242
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    322

    瀏覽量

    21901
  • mybatis
    +關(guān)注

    關(guān)注

    0

    文章

    64

    瀏覽量

    6935

原文標(biāo)題:Mybatis Plus很好,但也有坑!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    mybatis plus的常規(guī)用法

    上篇文章我們介紹過(guò)通過(guò) Mybatis Plus 進(jìn)行增刪改查,如下這段代碼: /** * 根據(jù)id修改 * UPDATE user SET user_name=?, user_age
    的頭像 發(fā)表于 09-25 15:06 ?1221次閱讀
    <b class='flag-5'>mybatis</b> <b class='flag-5'>plus</b>的常規(guī)用法

    Mybatis的內(nèi)部設(shè)計(jì)介紹

    Mybatis源碼分析-整體設(shè)計(jì)(一)
    發(fā)表于 06-06 09:43

    MyBatis的整合

    SpringBoot-15-之整合MyBatis-注解篇+分頁(yè)
    發(fā)表于 10-28 08:09

    Mybatis是什么

    Mybatis第一講
    發(fā)表于 06-04 15:33

    mybatis快速入門(mén)

    本文詳細(xì)介紹了mybatis相關(guān)知識(shí),以及mybatis快速入門(mén)步驟詳解。
    的頭像 發(fā)表于 02-24 09:41 ?3829次閱讀
    <b class='flag-5'>mybatis</b>快速入門(mén)

    一篇讓你熟練掌握 MyBatis-Plus!

    MyBatis-plus 是一款 Mybatis 增強(qiáng)工具,用于簡(jiǎn)化開(kāi)發(fā),提高效率。下文使用縮寫(xiě) mp來(lái)簡(jiǎn)化表示 MyBatis-plus,本文主要介紹 mp 搭配 Spring Boot
    的頭像 發(fā)表于 06-01 09:30 ?2889次閱讀
    一篇讓你熟練掌握 <b class='flag-5'>MyBatis-Plus</b>!

    Mybatis-Plus Mybatis增強(qiáng)工具包

    ./oschina_soft/gitee-mybatis-plus.zip
    發(fā)表于 06-13 11:34 ?1次下載
    <b class='flag-5'>Mybatis-Plus</b> <b class='flag-5'>Mybatis</b>增強(qiáng)工具包

    easy-mybatis Mybatis的增強(qiáng)框架

    ./oschina_soft/gitee-easy-mybatis.zip
    發(fā)表于 06-14 09:45 ?1次下載
    easy-<b class='flag-5'>mybatis</b> <b class='flag-5'>Mybatis</b>的增強(qiáng)框架

    MyBatis-Plus的使用與測(cè)試

    本文主要介紹mybatis-plus這款插件,針對(duì)springboot用戶。包括引入,配置,使用,以及擴(kuò)展等常用的方面做一個(gè)匯總整理,盡量包含大家常用的場(chǎng)景內(nèi)容。
    的頭像 發(fā)表于 08-22 11:56 ?1704次閱讀

    Fluent Mybatis、原生MybatisMybatis Plus對(duì)比

    mapper中再組裝參數(shù)。那對(duì)比原生Mybatis, Mybatis Plus或者其他框架,F(xiàn)luentMybatis提供了哪些便利呢?
    的頭像 發(fā)表于 09-15 15:41 ?1678次閱讀

    MyBatis-Plus為什么不支持聯(lián)表

    MyBatis Plus Join`一款專門(mén)解決MyBatis Plus 關(guān)聯(lián)查詢問(wèn)題的擴(kuò)展框架,他并不一款全新的框架,而是基于`MyBatis
    的頭像 發(fā)表于 02-28 15:19 ?3099次閱讀
    <b class='flag-5'>MyBatis-Plus</b>為什么不支持聯(lián)表

    介紹一款基于Mybatis-Plus的代碼自助生成器

    在基于Mybatis的開(kāi)發(fā)模式中,很多開(kāi)發(fā)者還會(huì)選擇Mybatis-Plus來(lái)輔助功能開(kāi)發(fā),以此提高開(kāi)發(fā)的效率。
    的頭像 發(fā)表于 05-23 14:16 ?1425次閱讀
    介紹一款基于<b class='flag-5'>Mybatis-Plus</b>的代碼自助生成器

    如何調(diào)優(yōu)MyBatis 25倍性能

    最近在壓測(cè)一批接口,發(fā)現(xiàn)接口處理速度慢的有點(diǎn)超出預(yù)期,感覺(jué)很奇怪,后面定位發(fā)現(xiàn)是數(shù)據(jù)庫(kù)批量保存這塊很慢。 這個(gè)項(xiàng)目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch。 我點(diǎn)進(jìn)去看了下源碼,感覺(jué)有點(diǎn)不太對(duì)勁
    的頭像 發(fā)表于 05-30 09:56 ?860次閱讀
    如何調(diào)優(yōu)<b class='flag-5'>MyBatis</b> 25倍性能

    MyBatis Plus如何簡(jiǎn)化開(kāi)發(fā)

    本篇文章,我們通過(guò) MyBatis Plus 來(lái)對(duì)一張表進(jìn)行 CRUD 操作,來(lái)看看是如何簡(jiǎn)化我們開(kāi)發(fā)的。 1、創(chuàng)建測(cè)試表 創(chuàng)建 USER 表: DROP TABLE IF EXISTS
    的頭像 發(fā)表于 10-09 15:08 ?665次閱讀
    <b class='flag-5'>MyBatis</b> <b class='flag-5'>Plus</b>如何簡(jiǎn)化開(kāi)發(fā)

    mybatis和mybatisplus的區(qū)別

    MyBatisMyBatis Plus是兩個(gè)非常受歡迎的Java持久層框架。這兩個(gè)框架在設(shè)計(jì)和功能上有一些區(qū)別,下面我將詳細(xì)介紹它們之間的差異以及各自的特點(diǎn)。 設(shè)計(jì)理念與目標(biāo): MyBati
    的頭像 發(fā)表于 12-03 11:53 ?3166次閱讀