女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Mybatis Plus很好,但也有坑!

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-11-27 16:17 ? 次閱讀


最近在開發一個后臺發送消息的功能時,由于需要給多個用戶發送消息,于是使用了 mybatis plus 提供的 saveBatch() 方法,在測試環境測試通過上預發布后,測試反應發送消息接口很慢得等 5、6 秒,于是我就登錄線上環境查看執行日志,發現是 mybatis plus 提供的 saveBatch() 方法執行很慢導致,于是也就有了本篇文章。

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

案發現場還原

/**
*先保存通知消息,在批量保存用戶通知記錄
*/
@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;
}

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

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

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

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

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

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

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

可以看出,我們批量保存用戶通知記錄是一條記錄一條進行保存得,已經可以猜測就是批量插入方法導致得耗時較高。

這里使用得是 mybatis log free 插件,它可以自動幫我們在控制臺打印完整得 mybatis sql 語句。有需要可以在 idea 插件中心搜索 mybatis log free 下載安裝。

結合 saveBatch() 底層源碼也能夠看出,mybatis plus 對于批量操作是通過 for 循環執行保存操作得,源碼如下圖,

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

到這里我們也就知道了在測試環境執行較快得原因,因為在測試環境需要批量保存得用戶通知記錄比較少,只有幾條記錄,所以很快。但是上預發布后,由于預發布中需要批量保存得用戶通知記錄比較多達到了數百條,所以執行較慢,耗時達到了 5、6 秒之久。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

解決方法

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

其實解決方法很簡單,只需要在 jdbcurl 上添加 rewriteBatchedStatements=true 參數即可解決這個問題。

MySQL 的 JDBC 連接的 url 中要加 rewriteBatchedStatements 參數,并保證 5.1.13 以上版本的驅動,才能實現高性能的批量插入。

MySQL JDBC 驅動在默認情況下會無視 executeBatch()語句,把我們期望批量執行的一組 sql 語句拆散,一條一條地發給 MySQL 數據庫,批量插入實際上是單條插入,直接造成較低的性能。只有把 rewriteBatchedStatements 參數置為 true, 驅動才會幫你批量執行 SQL。另外這個選項對 INSERT/UPDATE/DELETE 都有效。

rewriteBatchedStatements=true 的意思是,當你在 Java 程序中使用批量插入/修改/刪除(batching)時,MySQL JDBC 驅動程序將嘗試重新編寫(rewrite)你的 SQL 語句,以便更有效地執行這些批量插入操作。

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

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

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

總結

mybatis plus 給開發人員帶來了很多便利,但是其中也有一些坑點,比如上文所提到得批量操作耗時問題,如果不注意的話,就有可能調入坑里,各位開發同學可以檢查自己或者公司項目中 jdbcurl 是否缺失 rewriteBatchedStatements=true 參數,加以改正,避免重復掉入這個坑里。



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3900

    瀏覽量

    65761
  • 生成器
    +關注

    關注

    7

    文章

    322

    瀏覽量

    21674
  • mybatis
    +關注

    關注

    0

    文章

    63

    瀏覽量

    6867

原文標題:Mybatis Plus很好,但也有坑!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    mybatis plus的常規用法

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

    Mybatis的內部設計介紹

    Mybatis源碼分析-整體設計(一)
    發表于 06-06 09:43

    MyBatis的整合

    SpringBoot-15-之整合MyBatis-注解篇+分頁
    發表于 10-28 08:09

    Mybatis是什么

    Mybatis第一講
    發表于 06-04 15:33

    mybatis快速入門

    本文詳細介紹了mybatis相關知識,以及mybatis快速入門步驟詳解。
    的頭像 發表于 02-24 09:41 ?3776次閱讀
    <b class='flag-5'>mybatis</b>快速入門

    一篇讓你熟練掌握 MyBatis-Plus

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

    Mybatis-Plus Mybatis增強工具包

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

    easy-mybatis Mybatis的增強框架

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

    MyBatis-Plus的使用與測試

    本文主要介紹mybatis-plus這款插件,針對springboot用戶。包括引入,配置,使用,以及擴展等常用的方面做一個匯總整理,盡量包含大家常用的場景內容。
    的頭像 發表于 08-22 11:56 ?1613次閱讀

    Fluent Mybatis、原生MybatisMybatis Plus對比

    mapper中再組裝參數。那對比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?
    的頭像 發表于 09-15 15:41 ?1621次閱讀

    MyBatis-Plus為什么不支持聯表

    MyBatis Plus Join`一款專門解決MyBatis Plus 關聯查詢問題的擴展框架,他并不一款全新的框架,而是基于`MyBatis
    的頭像 發表于 02-28 15:19 ?2892次閱讀
    <b class='flag-5'>MyBatis-Plus</b>為什么不支持聯表

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

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

    如何調優MyBatis 25倍性能

    最近在壓測一批接口,發現接口處理速度慢的有點超出預期,感覺很奇怪,后面定位發現是數據庫批量保存這塊很慢。 這個項目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch。 我點進去看了下源碼,感覺有點不太對勁
    的頭像 發表于 05-30 09:56 ?798次閱讀
    如何調優<b class='flag-5'>MyBatis</b> 25倍性能

    MyBatis Plus如何簡化開發

    本篇文章,我們通過 MyBatis Plus 來對一張表進行 CRUD 操作,來看看是如何簡化我們開發的。 1、創建測試表 創建 USER 表: DROP TABLE IF EXISTS
    的頭像 發表于 10-09 15:08 ?588次閱讀
    <b class='flag-5'>MyBatis</b> <b class='flag-5'>Plus</b>如何簡化開發

    mybatis和mybatisplus的區別

    MyBatisMyBatis Plus是兩個非常受歡迎的Java持久層框架。這兩個框架在設計和功能上有一些區別,下面我將詳細介紹它們之間的差異以及各自的特點。 設計理念與目標: MyBati
    的頭像 發表于 12-03 11:53 ?3041次閱讀