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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

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

來(lái)源: 責(zé)編: 時(shí)間:2023-10-31 10:26:06 297觀看
導(dǎo)讀作者今天在開(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)境查看

作者今天在開(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)致,于是也就有了本篇文章。8UG28資訊網(wǎng)——每日最新資訊28at.com

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

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

/** * 先保存通知消息,在批量保存用戶通知記錄 */@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;}/** * 根據(jù)用戶id,組裝用戶通知記錄集合,返回200條記錄 */public List<String> fillNotifyRecordList(Notify notify, String receiveUserIds, List<NotifyRecord> collect) {    List<String> noticeRecordList = new ArrayList<>(200);    ...    // 組將兩百條用戶通知記錄    return noticeRecordList;}

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

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

前兩步驟耗時(shí)都很少,我們直接看第三步操作耗時(shí),結(jié)合 sql 執(zhí)行日志,如下,8UG28資訊網(wǎng)——每日最新資訊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

再結(jié)合 mybatis free log 插件打印完整 sql 如下圖,8UG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片8UG28資訊網(wǎng)——每日最新資訊28at.com

可以看出,我們批量保存用戶通知記錄是一條記錄一條進(jìn)行保存得,已經(jīng)可以猜測(cè)就是批量插入方法導(dǎo)致得耗時(shí)較高。8UG28資訊網(wǎng)——每日最新資訊28at.com

這里使用得是 mybatis log free 插件,它可以自動(dòng)幫我們?cè)诳刂婆_(tái)打印完整得 mybatis sql 語(yǔ)句。有需要可以在 idea 插件中心搜索 mybatis log free 下載安裝。8UG28資訊網(wǎng)——每日最新資訊28at.com

結(jié)合 saveBatch() 底層源碼也能夠看出,mybatis plus 對(duì)于批量操作是通過(guò) for 循環(huán)執(zhí)行保存操作得,源碼如下圖,8UG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片8UG28資訊網(wǎng)——每日最新資訊28at.com

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

解決方法

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

其實(shí)解決方法很簡(jiǎn)單,只需要在 jdbcurl 上添加 rewriteBatchedStatements=true 參數(shù)即可解決這個(gè)問(wèn)題。8UG28資訊網(wǎng)——每日最新資訊28at.com

MySQL 的 JDBC 連接的 url 中要加 rewriteBatchedStatements 參數(shù),并保證 5.1.13 以上版本的驅(qū)動(dòng),才能實(shí)現(xiàn)高性能的批量插入。8UG28資訊網(wǎng)——每日最新資訊28at.com

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 都有效。8UG28資訊網(wǎng)——每日最新資訊28at.com

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

OK,在我們給 jdbcurl 上添加了參數(shù)后,看看效果,如下圖,8UG28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片8UG28資訊網(wǎng)——每日最新資訊28at.com

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

總結(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è)坑里。8UG28資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: REST API設(shè)計(jì)模式和反模式

下一篇: 一文搞定專(zhuān)屬碼的設(shè)計(jì)與開(kāi)發(fā)

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場(chǎng)的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號(hào)為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號(hào)的橫向折疊屏,而是跟別的廠商一樣采用了較為常見(jiàn)的
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現(xiàn)已正式出爐,冠軍是來(lái)自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • iPhone賣(mài)不動(dòng)了!蘋(píng)果股價(jià)創(chuàng)年內(nèi)最大日跌幅:市值一夜蒸發(fā)萬(wàn)億元

    8月5日消息,今天凌晨美股三大指數(shù)高開(kāi)低走集體收跌,道指跌0.41%;納指跌0.36%;標(biāo)普500指數(shù)跌0.52%。熱門(mén)科技股也都變化極大,其中蘋(píng)果報(bào)181.99美元,跌4.8%,創(chuàng)
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個(gè)線程之間通過(guò)某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實(shí)現(xiàn)手段有以下幾種方式:Object 類(lèi)下
  • 一文看懂為蘋(píng)果Vision Pro開(kāi)發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋(píng)果的Vision Pro是一款混合現(xiàn)實(shí)(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(shí)(VR)和增強(qiáng)現(xiàn)實(shí)(AR)的沉浸感。其高分辨率顯示屏、先進(jìn)的傳感器和強(qiáng)大的處理能力
  • 之家push系統(tǒng)迭代之路

    前言在這個(gè)信息爆炸的互聯(lián)網(wǎng)時(shí)代,能夠及時(shí)準(zhǔn)確獲取信息是當(dāng)今社會(huì)要解決的關(guān)鍵問(wèn)題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動(dòng)拉"獲取信息的方式已不能滿足用
  • 如何通過(guò)Python線程池實(shí)現(xiàn)異步編程?

    線程池的概念和基本原理線程池是一種并發(fā)處理機(jī)制,它可以在程序啟動(dòng)時(shí)創(chuàng)建一組線程,并將它們置于等待任務(wù)的狀態(tài)。當(dāng)任務(wù)到達(dá)時(shí),線程池中的某個(gè)線程會(huì)被喚醒并執(zhí)行任務(wù),執(zhí)行完任
  • 中國(guó)家電海外掘金正當(dāng)時(shí)|出海專(zhuān)題

    作者|吳南南編輯|胡展嘉運(yùn)營(yíng)|陳佳慧出品|零態(tài)LT(ID:LingTai_LT)2023年,出海市場(chǎng)戰(zhàn)況空前,中國(guó)創(chuàng)業(yè)者在海外紛紛摩拳擦掌,以期能夠把中國(guó)的商業(yè)模式、創(chuàng)業(yè)理念、戰(zhàn)略打法輸出海外,他們依
  • 騰訊VS網(wǎng)易,最卷游戲暑期檔,誰(shuí)能笑到最后?

    作者:無(wú)銹缽來(lái)源:財(cái)經(jīng)無(wú)忌7月16日晚,上海1862時(shí)尚藝術(shù)中心。伴隨著幻象的精準(zhǔn)命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰(zhàn)隊(duì)以絕對(duì)的優(yōu)勢(shì)戰(zhàn)勝了BLG戰(zhàn)隊(duì),拿下了總決
Top 主站蜘蛛池模板: 凤山市| 宕昌县| 玉屏| 万年县| 五大连池市| 齐齐哈尔市| 南木林县| 舞阳县| 海口市| 大同县| 华蓥市| 当阳市| 隆尧县| 钦州市| 南开区| 崇仁县| 体育| 潜山县| 平安县| 西乌珠穆沁旗| 临江市| 全州县| 高雄县| 方正县| 衡南县| 琼海市| 平度市| 成武县| 耿马| 若羌县| 彩票| 忻城县| 乌拉特前旗| 大丰市| 京山县| 阿巴嘎旗| 武川县| 揭西县| 玉环县| 五家渠市| 彭州市|