国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MyBatis批量插入數(shù)據(jù)優(yōu)化,增加一個(gè)參數(shù),效率提升百倍

這篇具有很好參考價(jià)值的文章主要介紹了MyBatis批量插入數(shù)據(jù)優(yōu)化,增加一個(gè)參數(shù),效率提升百倍。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

項(xiàng)目中進(jìn)行接口壓測,發(fā)現(xiàn)批量插入的速度有點(diǎn)超出預(yù)期,感覺很奇怪,經(jīng)過定位后發(fā)現(xiàn)mybatise-plus批量保存的處理十分緩慢,使用的是saveBatch方法,這點(diǎn)有點(diǎn)想不通。于是就進(jìn)行了相關(guān)內(nèi)容分析。

根據(jù)mybatise-plus中saveBatch的方法進(jìn)行源碼查看:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

?

繼續(xù)跟蹤邏輯,從代碼上看,確實(shí)是一條條執(zhí)行了sqlSession.insert(sqlStatement, entity) 方法。

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫?繼續(xù)跟蹤,下面的consumer執(zhí)行的就是上面的sqlSession.insert方法:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

具體執(zhí)行邏輯中是累計(jì)到 一定數(shù)量后,一批數(shù)據(jù)進(jìn)行flush。

其實(shí),從上述的代碼實(shí)現(xiàn)上看,整個(gè)實(shí)現(xiàn)機(jī)制跟我們預(yù)想的差不多,基本上是批量的實(shí)現(xiàn)思路。這種批量的處理肯定比一條條的insert要快。

但是,為什么還是如此的緩慢。

下面我們就進(jìn)行一個(gè)粗略的實(shí)驗(yàn),來對(duì)比一波。現(xiàn)在使用4種方式進(jìn)行比較:

1、批量數(shù)據(jù)單條執(zhí)行,調(diào)用myBatise方法save

2、批量執(zhí)行調(diào)用myBatise方法saveBatch

3、通過xml手寫sql批量插入

4、JDBC方式批量插入開始進(jìn)行實(shí)驗(yàn)

1、1000條數(shù)據(jù),一條條的插入

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫?

執(zhí)行結(jié)果為:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

可以看到,執(zhí)行一批1000條點(diǎn)的數(shù)據(jù),耗費(fèi)時(shí)間為1173毫秒。

2、1000條數(shù)據(jù),使用mybatise-plus的saveBatch插入

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

執(zhí)行結(jié)果為:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

?可以看到,本次總的耗時(shí)為289毫秒,比一條條的插入快了大約4倍,效率還是可以的。

3、通過xml手寫sql批量插入。

Xml中拼接內(nèi)容為:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

Java代碼內(nèi)容為:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

執(zhí)行程序看下性能如何:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

本次耗時(shí)只有34毫秒,性能比saveBatch提高了7倍

4、JDBC方式批量插入開始進(jìn)行實(shí)驗(yàn)

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

執(zhí)行情況:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

本次耗時(shí)142毫秒,

執(zhí)行效率比saveBatch要快,比手動(dòng)拼接方式要慢,

綜上所述,手動(dòng)拼接sql的方式是批量保存效率最佳。

5、結(jié)論

整個(gè)執(zhí)行結(jié)果跟預(yù)期的不一樣,這里我們直接說結(jié)論,因?yàn)閙ybatise-plus的saveBatch方法會(huì)繼續(xù)調(diào)用mysql驅(qū)動(dòng)中的實(shí)現(xiàn),

在Mysql的驅(qū)動(dòng)jar中,ClientPreparedStatement.java中executeBatchInternal()方法中

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

就是這個(gè)叫 rewriteBatchedStatements 的屬性,從名字來看是要重寫批操作的 Statement,前面batchHasPlainStatements 已經(jīng)是 false,取反肯定是 true,所以只要這參數(shù)是 true 就會(huì)進(jìn)行一波操作。

屬性默認(rèn)是 false。

可以直接將 jdbcurl 加上了這個(gè)參數(shù):

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

看下 executeBatchedInserts 究竟干了什么,在上面基礎(chǔ)上繼續(xù)執(zhí)行邏輯,

果然,sql語句倍rewrite了:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

對(duì)于插入而言,所謂的rewrite其實(shí)就是將一批插入拼接成insert into XXX values(a),(b)…

這樣的一條語句形式后再執(zhí)行,這樣一來跟拼接sql的效果是一樣的。

那么,為什么默認(rèn)不給這個(gè)rewriteBatchedStatements屬性設(shè)置為true,

原來有如下原因:

看下 executeBatchedInserts 究竟干了什么:

1.???? 如果批量語句中的某些語句失敗,則默認(rèn)重寫會(huì)導(dǎo)致所有語句都失敗。

2.???? 批量語句的某些語句參數(shù)不一樣,則默認(rèn)重寫會(huì)使得查詢緩存未命中。

看起來影響不大,所以我給我的項(xiàng)目設(shè)置上了這個(gè)參數(shù)!

最后我稍微總結(jié)下粗略的對(duì)比:大家如果想要更準(zhǔn)確的實(shí)現(xiàn),可以自己進(jìn)行更多組數(shù)據(jù)測試:

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

以如果有使用 jdbc 的 Batch 性能方面的需求,要將 rewriteBatchedStatements 設(shè)置為 true,這樣能提高很多性能。

然后如果喜歡手動(dòng)拼接 sql 要注意一次拼接的數(shù)量,分批處理。

以上為全部內(nèi)容。

歡迎關(guān)注10W+的微信公眾號(hào):

mybatis每次提交1000條數(shù)據(jù),Java架構(gòu)師基礎(chǔ)技術(shù)體系,mybatis,java,數(shù)據(jù)庫

技術(shù)難點(diǎn)歡迎咨詢,如有需要加我微信:1106915848。

星光不問趕路人,時(shí)光不負(fù)有心人文章來源地址http://www.zghlxwxcb.cn/news/detail-606178.html

到了這里,關(guān)于MyBatis批量插入數(shù)據(jù)優(yōu)化,增加一個(gè)參數(shù),效率提升百倍的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • mybatis批量插入數(shù)據(jù)list超過一定長度時(shí)報(bào)錯(cuò)的解決辦法(批量插入數(shù)據(jù),數(shù)據(jù)過多時(shí)報(bào)錯(cuò)解決和批量修改報(bào)錯(cuò)

    在使用MyBatis進(jìn)行批量新增時(shí),如果數(shù)據(jù)量較大,可以考慮分批次插入以減少數(shù)據(jù)庫的負(fù)載壓力。這里提供一種基于MyBatis的分批次插入的方法: 創(chuàng)建一個(gè)新的Mapper XML文件(例如:BatchInsertMapper.xml)來定義批量插入的SQL語句。在該XML文件中,添加如下內(nèi)容: ? 請(qǐng)將上述代碼中

    2024年02月16日
    瀏覽(29)
  • 批量插入或更新數(shù)據(jù)(MyBatis-plus框架)

    批量插入或更新數(shù)據(jù)(MyBatis-plus框架)

    目錄 1.場景說明 2.DUPLICATE?和REPLACE比較 3.批量插入或者更新(兩種方式) 方式一:mybatis-plus的saveOrUpdateBatch方法 問題:如果操作類集成了基礎(chǔ)類,比如封裝了BaseEntity去集成,那么這樣使用會(huì)出問題 方式二:on duplicate key (推薦) 4.注意 5.常見問題? 插入數(shù)據(jù)時(shí),我們經(jīng)常會(huì)遇到這

    2024年02月04日
    瀏覽(24)
  • SpringBoot+MyBatis批量插入數(shù)據(jù)的三種方式

    最近導(dǎo)入表格數(shù)據(jù)時(shí)需要同時(shí)插入修改大量數(shù)據(jù),研究了一下有三種實(shí)現(xiàn)方式 1、用for循環(huán)調(diào)用sql插入數(shù)據(jù) 這種方式插入大量數(shù)據(jù)時(shí),效率非常底下,不推薦 2、利用mybatis的foreach來實(shí)現(xiàn)循環(huán)插入 這種方式插入大量數(shù)據(jù)時(shí),好處是不用頻繁訪問數(shù)據(jù)庫,一條sql搞定,效率比較

    2024年02月16日
    瀏覽(20)
  • mybatis批量插入數(shù)據(jù)導(dǎo)致系統(tǒng)OOM,微服務(wù)內(nèi)存爆了

    mybatis批量插入數(shù)據(jù)導(dǎo)致系統(tǒng)OOM,微服務(wù)內(nèi)存爆了

    今天我們來說說工作中遇到的一個(gè)真實(shí)案例,由于使用mybatis的批量插入功能,導(dǎo)致系統(tǒng)內(nèi)存溢出OOM(Out Of Memory), \\\"java.lang.OutOfMemoryError: Java heap space\\\"的報(bào)錯(cuò),導(dǎo)致服務(wù)出現(xiàn)短暫的服務(wù)不可用,大概一兩分鐘不可用。這其實(shí)是個(gè)非常危險(xiǎn)的故障,可能在高峰期導(dǎo)致整個(gè)系統(tǒng)癱

    2024年02月01日
    瀏覽(22)
  • MySQL---使用索引優(yōu)化、大批量插入數(shù)據(jù)優(yōu)化

    MySQL---使用索引優(yōu)化、大批量插入數(shù)據(jù)優(yōu)化

    1. 使用索引優(yōu)化 索引是數(shù)據(jù)庫優(yōu)化最常用也是最重要的手段之一 , 通過索引通常可以幫助用戶解決大多數(shù)的 MySQL 的性能優(yōu)化問題: 1.1?避免索引失效應(yīng)用-全值匹配 該情況下,索引生效,執(zhí)行效率高。 1.2?避免索引失效應(yīng)用-最左前綴法則 1.3?避免索引失效應(yīng)用-其他匹配原則

    2024年02月07日
    瀏覽(24)
  • java 批量插入千萬條數(shù)據(jù)優(yōu)化方案【值得收藏】

    java 批量插入千萬條數(shù)據(jù)優(yōu)化方案【值得收藏】

    再實(shí)際開發(fā)應(yīng)用中總會(huì)面臨導(dǎo)入大批量數(shù)據(jù)插入數(shù)據(jù)庫、數(shù)據(jù)遷移、同步等操作在java 后臺(tái)執(zhí)行,執(zhí)行效率的優(yōu)化問題隨之而來!比如如何 快速往MySQL數(shù)據(jù)庫中導(dǎo)入1000萬數(shù)據(jù) 2、MySQL中新建一張user表,為了方便演示只保留id、昵稱、年齡3個(gè)字段,建表語句; 3、再次打開pom.x

    2023年04月23日
    瀏覽(24)
  • Mybatis批量更新數(shù)據(jù)及其優(yōu)化

    需求場景 :定時(shí)任務(wù)中,從其他平臺(tái)同步數(shù)據(jù),并更新當(dāng)前平臺(tái)數(shù)據(jù)庫,表數(shù)據(jù)3W+,分批更新某個(gè)字段,耗時(shí)巨大,約30min,嘗試性能優(yōu)化。 批量更新的幾種常見方式: 1.foreach 循環(huán) 在mybatis的xml文件中,使用foreach動(dòng)態(tài)標(biāo)簽拼接SQL語句,每一條數(shù)據(jù)的更新語句對(duì)應(yīng)一條update語

    2024年02月10日
    瀏覽(19)
  • MySQL——插入加鎖/唯一索引插入死鎖/批量插入效率

    MySQL——插入加鎖/唯一索引插入死鎖/批量插入效率

    本篇主要介紹MySQL跟加鎖相關(guān)的一些概念、MySQL執(zhí)行插入Insert時(shí)的加鎖過程、唯一索引下批量插入可能導(dǎo)致的死鎖情況,以及分別從業(yè)務(wù)角度和MySQL配置角度介紹提升批量插入的效率的方法; 在介紹MySQL執(zhí)行插入的加鎖過程之前,先復(fù)習(xí)下幾種跟鎖相關(guān)的概念; 快照讀 InnoDB 利

    2024年02月12日
    瀏覽(19)
  • mysql 批量數(shù)據(jù)插入很慢(kettle 輸入輸出組件) 性能優(yōu)化辦法

    mysql 批量數(shù)據(jù)插入很慢(kettle 輸入輸出組件) 性能優(yōu)化辦法

    背景 最近在做數(shù)倉重構(gòu)項(xiàng)目,遇到一些性能瓶頸,這里記錄一下解決辦法。 隨著業(yè)務(wù)數(shù)據(jù)每天都在增加,幾年前開發(fā)的etl任務(wù)開始跑不動(dòng)了。大表一般是通過增量的方式插入,但是修復(fù)bug 或者每月/季度跑一次的情況 需要跑全量,原來的etl任務(wù)可能需要跑幾個(gè)小時(shí),甚至出

    2024年01月17日
    瀏覽(27)
  • Golang使用CopyIn進(jìn)行批量創(chuàng)建,提高插入效率

    本文介紹兩點(diǎn): 如何在golang中使用copyin 如何對(duì)特殊字符jsonb進(jìn)行插入(需要顯式強(qiáng)制轉(zhuǎn)化為string類型)

    2024年02月16日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包