自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開(kāi)發(fā) 前端
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è)坑里。

作者今天在開(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
public 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í)行邏輯如下,

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

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

-- 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 如下圖,

圖片圖片

可以看出,我們批量保存用戶通知記錄是一條記錄一條進(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í)行保存操作得,源碼如下圖,

圖片圖片

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

解決方法

到這里,也就是本文得重點(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試重新編寫(rewrite)你的 SQL 語(yǔ)句,以便更有效地執(zhí)行這些批量插入操作。

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

圖片圖片

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

總結(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è)坑里。

責(zé)任編輯:武曉燕 來(lái)源: waynblog
相關(guān)推薦

2023-07-29 22:02:06

MyBatis數(shù)據(jù)庫(kù)配置

2024-12-20 16:49:15

MyBatis開(kāi)發(fā)代碼

2025-02-06 07:45:44

2024-08-27 09:02:21

2023-06-07 08:08:37

MybatisSpringBoot

2025-02-27 09:45:47

2023-06-14 08:34:18

Mybatis死鎖框架

2023-06-07 08:00:00

MySQL批量插入

2022-07-15 13:58:46

工具MyBatissql

2013-06-20 11:11:00

程序員經(jīng)理

2020-04-14 10:06:20

微服務(wù)Netflix語(yǔ)言

2024-11-28 19:03:56

2024-07-31 09:56:20

2024-02-28 09:35:52

2023-01-12 09:13:49

Mybatis數(shù)據(jù)庫(kù)

2023-01-17 09:13:08

Mybatis后端框架

2025-02-13 07:59:13

2024-01-15 09:15:52

parallel語(yǔ)句函數(shù)

2020-12-18 08:28:13

Redis數(shù)據(jù)數(shù)據(jù)庫(kù)

2017-10-12 10:06:23

Linux內(nèi)存free命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)