欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis-plus 批量插入太慢的問題解決(提升插入性能)

 更新時(shí)間:2021年11月09日 10:47:23   作者:Crystalqy  
公司使用的Mybatis-Plus操作SQL,用過Mybatis-Plus的小伙伴一定知道他有很多API提供給我們使用,但是批量插入大數(shù)據(jù)太慢應(yīng)該怎么解決,本文就詳細(xì)的介紹一下,感興趣的可以了解一下

MyBatis-Plus(簡(jiǎn)稱MP)是一個(gè)MyBatis的增強(qiáng)工具,旨在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生。

特點(diǎn)

無侵入:只做增強(qiáng)不做改變,引入它不會(huì)對(duì)現(xiàn)有工程產(chǎn)生影響,如絲般順滑

損耗?。?jiǎn)?dòng)即會(huì)自動(dòng)注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?/p>

強(qiáng)大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實(shí)現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類使用需求

支持 Lambda 形式調(diào)用:通過 Lambda 表達(dá)式,方便的編寫各類查詢條件,無需再擔(dān)心字段寫錯(cuò)

支持主鍵自動(dòng)生成:支持多達(dá) 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題

支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實(shí)體類只需繼承 Model 類即可進(jìn)行強(qiáng)大的 CRUD 操作

支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )

內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用

內(nèi)置分頁(yè)插件:基于 MyBatis 物理分頁(yè),開發(fā)者無需關(guān)心具體操作,配置好插件之后,寫分頁(yè)等同于普通 List 查詢

分頁(yè)插件支持多種數(shù)據(jù)庫(kù):支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數(shù)據(jù)庫(kù)

內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時(shí)間,建議開發(fā)測(cè)試時(shí)啟用該功能,能快速揪出慢查詢

內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作

MP功能強(qiáng)大,但是上線后發(fā)現(xiàn)有一個(gè)問題,他內(nèi)置的saveBatch批量插入功能有著巨大的隱患,查看源碼發(fā)現(xiàn)他是這么實(shí)現(xiàn)的

其中關(guān)鍵的方法executeBatch源碼為:

啟動(dòng)服務(wù)后,用Postman調(diào)試,后臺(tái)打印如下:

從圖上可以看出這個(gè)所謂的批量插入接口,其實(shí)就是一個(gè)for循環(huán)插入,所以會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生很大的壓力,第一反應(yīng)是手工實(shí)現(xiàn),這樣

INSERT INTO test (a, b, c) VALUES
<foreach collection="list" item="item" separator=",">
    (#{item.a}, #{item.b}, #{item.c})
</foreach>

但是仔細(xì)閱讀源碼發(fā)現(xiàn),他的CRUD方法其實(shí)都是實(shí)現(xiàn)了一個(gè)叫做AbstractMethod的類的,類繼承如圖

其中我們看到有一個(gè)方法是InsertBatchSomeColumn,這個(gè)方法實(shí)際上就是我們手寫的那種批量插入的功能的實(shí)現(xiàn)了,我們現(xiàn)在要做的是把這個(gè)方法注入到我們的工程中,并且替換掉之前的saveBatch方法

第一步:新增我們自己的SQL注入器,用來擴(kuò)展批量插入

public class CxmSqlInjector extends DefaultSqlInjector{
    
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        // 防止父類的方法不可使用
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        // 添加批量插入的方法
        methodList.add(new InsertBatchSomeColumn());
        return methodList;
    }
 
}

第二步:把上面的類注入到Spring中

第三步:在我們的BaseDAO中聲明該方法

第四步:重寫saveBatch

最后再調(diào)用saveBatch的時(shí)候就會(huì)發(fā)現(xiàn)完成了批量插入的時(shí)候不是for 循環(huán)插入了,大功告成?。?!

到此這篇關(guān)于Mybatis-plus 批量插入太慢的問題解決(提升插入性能)的文章就介紹到這了,更多相關(guān)Mybatis-plus 批量插入太慢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用Maven管理項(xiàng)目?Maven管理項(xiàng)目實(shí)例

    如何使用Maven管理項(xiàng)目?Maven管理項(xiàng)目實(shí)例

    下面小編就為大家?guī)硪黄绾问褂肕aven管理項(xiàng)目?Maven管理項(xiàng)目實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot @Autowired注入為空的情況解讀

    SpringBoot @Autowired注入為空的情況解讀

    這篇文章主要介紹了SpringBoot @Autowired注入為空的情況解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java?關(guān)鍵字break和continue的使用說明

    Java?關(guān)鍵字break和continue的使用說明

    這篇文章主要介紹了Java?關(guān)鍵字break和continue的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • springMvc和mybatis-plus中枚舉值和字段的映射

    springMvc和mybatis-plus中枚舉值和字段的映射

    這篇文章主要為大家介紹了springMvc和mybatis-plus中枚舉值和字段的映射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Spring Boot 集成 Kafkad的實(shí)現(xiàn)示例

    Spring Boot 集成 Kafkad的實(shí)現(xiàn)示例

    這篇文章主要介紹了Spring Boot 集成 Kafkad的示例,幫助大家更好的理解和學(xué)習(xí)使用Spring Boot框架,感興趣的朋友可以了解下
    2021-04-04
  • java實(shí)現(xiàn)簡(jiǎn)單銀行家算法

    java實(shí)現(xiàn)簡(jiǎn)單銀行家算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單銀行家算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 解決springcloud集成nacos遇到的問題

    解決springcloud集成nacos遇到的問題

    這篇文章介紹了如何解決springcloud集成nacos遇到的問題,文章中有詳細(xì)的代碼示例,需要的朋友可以參考一下
    2023-04-04
  • Java使用泛型Class實(shí)現(xiàn)消除模板代碼

    Java使用泛型Class實(shí)現(xiàn)消除模板代碼

    Class作為實(shí)現(xiàn)反射功能的類,在開發(fā)中經(jīng)常會(huì)用到,然而,當(dāng)Class遇上泛型后,事情就變得不是那么簡(jiǎn)單了,所以本文就來講講Java如何使用泛型Class實(shí)現(xiàn)消除模板代碼,需要的可以參考一下
    2023-06-06
  • Mybatis?Example的高級(jí)用法詳解

    Mybatis?Example的高級(jí)用法詳解

    這篇文章主要介紹了Mybatis?Example的高級(jí)用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • CompletableFuture并行處理List分批數(shù)據(jù)demo

    CompletableFuture并行處理List分批數(shù)據(jù)demo

    這篇文章主要介紹了CompletableFuture并行處理List分批數(shù)據(jù)實(shí)現(xiàn)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論