日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Mybatis-Plus很好,但是我被它坑了!

來源: 責編: 時間:2023-10-31 10:26:06 275觀看
導讀作者今天在開發一個后臺發送消息的功能時,由于需要給多個用戶發送消息,于是使用了 mybatis plus 提供的 saveBatch() 方法,在測試環境測試通過上預發布后,測試反應發送消息接口很慢得等 5、6 秒,于是我就登錄線上環境查看

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

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

案發現場還原

/** * 先保存通知消息,在批量保存用戶通知記錄 */@Transactional(rollbackFor = Exception.class)@Overridepublic boolean saveNotice(Notify notify, String receiveUserIds) {    long begin = System.currentTimeMillis();    notify.setCreateTime(new Date());    notify.setCreateBy(ShiroUtil.getSessionUid());    if (notify.getPublishTime() == null) {        notify.setPublishTime(new Date());    }    boolean insert = save(notify);    List<NotifyRecord> collect = new ArrayList<>();    List<String> receiveUserList = fillNotifyRecordList(notify, receiveUserIds, collect);    notifyRecordService.saveBatch(collect);    long end = System.currentTimeMillis();    System.out.println(end - begin);    ...    return insert;}/** * 根據用戶id,組裝用戶通知記錄集合,返回200條記錄 */public List<String> fillNotifyRecordList(Notify notify, String receiveUserIds, List<NotifyRecord> collect) {    List<String> noticeRecordList = new ArrayList<>(200);    ...    // 組將兩百條用戶通知記錄    return noticeRecordList;}

如上代碼,我有一個 saveNotice() 方法用于保存通知消息以及用戶通知記錄。執行邏輯如下,XVd28資訊網——每日最新資訊28at.com

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

前兩步驟耗時都很少,我們直接看第三步操作耗時,結合 sql 執行日志,如下,XVd28資訊網——每日最新資訊28at.com

-- slow sql 5542 millis. INSERT INTO oa_notify_record  ( notifyId, receiveUserId, receiveUserName, isRead,  createTime )  VALUES  ( ?, ?, ?, ?,  ? )[225,"fcd90fe3990e505d07c90a238f75e9c1","niuwawa",false,"2023-10-30 23:54:04"]5681

再結合 mybatis free log 插件打印完整 sql 如下圖,XVd28資訊網——每日最新資訊28at.com

圖片圖片XVd28資訊網——每日最新資訊28at.com

可以看出,我們批量保存用戶通知記錄是一條記錄一條進行保存得,已經可以猜測就是批量插入方法導致得耗時較高。XVd28資訊網——每日最新資訊28at.com

這里使用得是 mybatis log free 插件,它可以自動幫我們在控制臺打印完整得 mybatis sql 語句。有需要可以在 idea 插件中心搜索 mybatis log free 下載安裝。XVd28資訊網——每日最新資訊28at.com

結合 saveBatch() 底層源碼也能夠看出,mybatis plus 對于批量操作是通過 for 循環執行保存操作得,源碼如下圖,XVd28資訊網——每日最新資訊28at.com

圖片圖片XVd28資訊網——每日最新資訊28at.com

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

解決方法

到這里,也就是本文得重點所在了,那怎么解決這個問題嘞?如何既利用 mybatis plus 提供得便攜性,也能夠解決批量操作耗時較高得問題。XVd28資訊網——每日最新資訊28at.com

其實解決方法很簡單,只需要在 jdbcurl 上添加 rewriteBatchedStatements=true 參數即可解決這個問題。XVd28資訊網——每日最新資訊28at.com

MySQL 的 JDBC 連接的 url 中要加 rewriteBatchedStatements 參數,并保證 5.1.13 以上版本的驅動,才能實現高性能的批量插入。XVd28資訊網——每日最新資訊28at.com

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

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

OK,在我們給 jdbcurl 上添加了參數后,看看效果,如下圖,XVd28資訊網——每日最新資訊28at.com

圖片圖片XVd28資訊網——每日最新資訊28at.com

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

總結

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

本文鏈接:http://www.www897cc.com/showinfo-26-16014-0.htmlMybatis-Plus很好,但是我被它坑了!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 數據結構分類以及數據結構特點、優缺點

下一篇: Lodash 真的死了嗎?Lodash 5 在哪里?

標簽:
  • 熱門焦點
  • 一加Ace2 Pro真機揭曉 鈦空灰配色質感拉滿

    終于,在經過了幾波預熱之后,一加Ace2 Pro的外觀真機圖在網上出現了。還是博主數碼閑聊站曝光的,這次的外觀設計還是延續了一加11的方案,只是細節上有了調整,例如新加入了鈦空灰
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 8月見!小米MIX Fold 3獲得3C認證:支持67W快充

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 回歸OPPO兩年,一加贏了銷量,輸了品牌

    成為OPPO旗下主打性能的先鋒品牌后,一加屢創佳績。今年618期間,一加手機全渠道銷量同比增長362%,憑借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 質感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 電博會與軟博會實現"線下+云端"的雙線融合

    在本次“電博會”與“軟博會”雙展會利好條件的加持下,既可以發揮展會拉動人流、信息流、資金流實現快速交互流動的作用,繼而推動區域經濟良性發展;又可以聚
Top 主站蜘蛛池模板: 甘泉县| 翼城县| 广德县| 商丘市| 黔江区| 宾阳县| 会理县| 吉林省| 靖远县| 进贤县| 乌审旗| 高密市| 精河县| 宿州市| 红安县| 旬邑县| 斗六市| 岳西县| 莒南县| 宜宾县| 都江堰市| 米易县| 仁寿县| 定远县| 涞源县| 朝阳县| 中超| 长治市| 宜川县| 云阳县| 巴林左旗| 富锦市| 遵化市| 玉溪市| 当阳市| 临汾市| 山东省| 前郭尔| 屏南县| 永胜县| 苗栗市|