精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MyBatis原生批量插入的坑與解決方案!

數(shù)據(jù)庫 其他數(shù)據(jù)庫
本文我們演示了 MyBatis 原生批量插入時(shí)的問題:可能會(huì)因?yàn)椴迦氲臄?shù)據(jù)太多從而導(dǎo)致運(yùn)行失敗,我們可以通過分片的方式來解決此問題。

[[429438]]

作者 | 王磊

來源 | Java中文社群(ID:javacn666)

轉(zhuǎn)載請(qǐng)聯(lián)系授權(quán)(微信ID:GG_Stone)

前面的文章咱們講了 MyBatis 批量插入的 3 種方法:循環(huán)單次插入、MyBatis Plus 批量插入、MyBatis 原生批量插入,詳情請(qǐng)點(diǎn)擊《MyBatis 批量插入數(shù)據(jù)的 3 種方法!》。

但之前的文章也有不完美之處,原因在于:使用 「循環(huán)單次插入」的性能太低,使用「MyBatis Plus 批量插入」性能還行,但要額外的引入 MyBatis Plus 框架,使用「MyBatis 原生批量插入」性能最好,但在插入大量數(shù)據(jù)時(shí)會(huì)導(dǎo)致程序報(bào)錯(cuò),那么,今天咱們就會(huì)提供一個(gè)更優(yōu)的解決方案。

原生批量插入的“坑”

首先,我們來看一下 MyBatis 原生批量插入中的坑,當(dāng)我們批量插入 10 萬條數(shù)據(jù)時(shí),實(shí)現(xiàn)代碼如下:

  1. import com.example.demo.model.User
  2. import com.example.demo.service.impl.UserServiceImpl; 
  3. import org.junit.jupiter.api.Test; 
  4. import org.springframework.beans.factory.annotation.Autowired; 
  5. import org.springframework.boot.test.context.SpringBootTest; 
  6.  
  7. import java.util.ArrayList; 
  8. import java.util.List; 
  9.  
  10. @SpringBootTest 
  11. class UserControllerTest { 
  12.  
  13.     // 最大循環(huán)次數(shù) 
  14.     private static final int MAXCOUNT = 100000; 
  15.  
  16.     @Autowired 
  17.     private UserServiceImpl userService; 
  18.      
  19.     /** 
  20.      * 原生自己拼接 SQL,批量插入 
  21.      */ 
  22.     @Test 
  23.     void saveBatchByNative() { 
  24.         long stime = System.currentTimeMillis(); // 統(tǒng)計(jì)開始時(shí)間 
  25.         List<User> list = new ArrayList<>(); 
  26.         for (int i = 0; i < MAXCOUNT; i++) { 
  27.             User user = new User(); 
  28.             user.setName("test:" + i); 
  29.             user.setPassword("123456"); 
  30.             list.add(user); 
  31.         } 
  32.         // 批量插入 
  33.         userService.saveBatchByNative(list); 
  34.         long etime = System.currentTimeMillis(); // 統(tǒng)計(jì)結(jié)束時(shí)間 
  35.         System.out.println("執(zhí)行時(shí)間:" + (etime - stime)); 
  36.     } 

核心文件 UserMapper.xml 中的實(shí)現(xiàn)代碼如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"
  3. <mapper namespace="com.example.demo.mapper.UserMapper"
  4.     <insert id="saveBatchByNative"
  5.         INSERT INTO `USER`(`NAME`,`PASSWORD`) VALUES 
  6.         <foreach collection="list" separator="," item="item"
  7.             (#{item.name},#{item.password}) 
  8.         </foreach> 
  9.     </insert
  10.  
  11. </mapper> 

當(dāng)我們開心地運(yùn)行以上程序時(shí),就出現(xiàn)了以下的一幕:

沃,程序竟然報(bào)錯(cuò)了!

這是因?yàn)槭褂?MyBatis 原生批量插入拼接的插入 SQL 大小是 4.56M,而默認(rèn)情況下 MySQL 可以執(zhí)行的最大 SQL 為 4M,那么在程序執(zhí)行時(shí)就會(huì)報(bào)錯(cuò)了。

解決方案

以上的問題就是因?yàn)榕坎迦霑r(shí)拼接的 SQL 文件太多了,所以導(dǎo)致 MySQL 的執(zhí)行報(bào)錯(cuò)了。那么我們第一時(shí)間想到的解決方案就是將大文件分成 N 個(gè)小文件,這樣就不會(huì)因?yàn)?SQL 太大而導(dǎo)致執(zhí)行報(bào)錯(cuò)了。也就是說,我們可以將待插入的 List 集合分隔為多個(gè)小 List 來執(zhí)行批量插入的操作,而這個(gè)操作過程就叫做 List 分片。

有了處理思路之后,接下來就是實(shí)踐了,那如何對(duì)集合進(jìn)行分片操作呢?

分片操作的實(shí)現(xiàn)方式有很多種,這個(gè)我們后文再講,接下來我們使用最簡單的方式,也就是 Google 提供的 Guava 框架來實(shí)現(xiàn)分片的功能。

分片 Demo 實(shí)戰(zhàn)

要實(shí)現(xiàn)分片功能,第一步我們先要添加 Guava 框架的支持,在 pom.xml 中添加以下引用:

  1. <!-- google guava 工具類 --> 
  2. <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> 
  3. <dependency> 
  4.   <groupId>com.google.guava</groupId> 
  5.   <artifactId>guava</artifactId> 
  6.   <version>31.0.1-jre</version> 
  7. </dependency> 

接下來我們寫一個(gè)小小的 demo,將以下 7 個(gè)人名分為 3 組(每組最多 3 個(gè)),實(shí)現(xiàn)代碼如下:

  1. import com.google.common.collect.Lists; 
  2.  
  3. import java.util.Arrays; 
  4. import java.util.List; 
  5.  
  6. /** 
  7.  * Guava 分片 
  8.  */ 
  9. public class PartitionByGuavaExample { 
  10.     // 原集合 
  11.     private static final List<String> OLD_LIST = Arrays.asList( 
  12.             "唐僧,悟空,八戒,沙僧,曹操,劉備,孫權(quán)".split(",")); 
  13.  
  14.     public static void main(String[] args) { 
  15.         // 集合分片 
  16.         List<List<String>> newList = Lists.partition(OLD_LIST, 3); 
  17.         // 打印分片集合 
  18.         newList.forEach(i -> { 
  19.             System.out.println("集合長度:" + i.size()); 
  20.         }); 
  21.     } 

以上程序的執(zhí)行結(jié)果如下:

從上述結(jié)果可以看出,我們只需要使用 Guava 提供的 Lists.partition 方法就可以很輕松的將一個(gè)集合進(jìn)行分片了。

原生批量插入分片實(shí)現(xiàn)

那接下來,就是改造我們的 MyBatis 批量插入代碼了,具體實(shí)現(xiàn)如下:

  1. @Test 
  2. void saveBatchByNativePartition() { 
  3.     long stime = System.currentTimeMillis(); // 統(tǒng)計(jì)開始時(shí)間 
  4.     List<User> list = new ArrayList<>(); 
  5.     // 構(gòu)建插入數(shù)據(jù) 
  6.     for (int i = 0; i < MAXCOUNT; i++) { 
  7.         User user = new User(); 
  8.         user.setName("test:" + i); 
  9.         user.setPassword("123456"); 
  10.         list.add(user); 
  11.     } 
  12.     // 分片批量插入 
  13.     int count = (int) Math.ceil(MAXCOUNT / 1000.0); // 分為 n 份,每份 1000 條 
  14.     List<List<User>> listPartition = Lists.partition(list, count); 
  15.     // 分片批量插入 
  16.     for (List<User> item : listPartition) { 
  17.         userService.saveBatchByNative(item); 
  18.     } 
  19.     long etime = System.currentTimeMillis(); // 統(tǒng)計(jì)結(jié)束時(shí)間 
  20.     System.out.println("執(zhí)行時(shí)間:" + (etime - stime)); 

執(zhí)行以上程序,最終的執(zhí)行結(jié)果如下:

從上圖可以看出,之前批量插入時(shí)的異常報(bào)錯(cuò)不見了,并且此實(shí)現(xiàn)方式的執(zhí)行效率竟比 MyBatis Plus 的批量插入的執(zhí)行效率要高,MyBatis Plus 批量插入 10W 條數(shù)據(jù)的執(zhí)行時(shí)間如下:

總結(jié)本文我們演示了 MyBatis 原生批量插入時(shí)的問題:可能會(huì)因?yàn)椴迦氲臄?shù)據(jù)太多從而導(dǎo)致運(yùn)行失敗,我們可以通過分片的方式來解決此問題,分片批量插入的實(shí)現(xiàn)步驟如下:

  1. 計(jì)算出分片的數(shù)量(分為 N 批);
  2. 使用 Lists.partition 方法將集合進(jìn)行分片(分為 N 個(gè)集合);
  3. 循環(huán)將分片的集合進(jìn)行批量插入的操作。

 

責(zé)任編輯:姜華 來源: Java中文社群
相關(guān)推薦

2019-12-05 08:44:20

MybatisSQL場(chǎng)景

2009-09-14 19:39:14

批量線程同步

2023-09-11 07:11:04

CSSNesting

2025-10-29 06:00:00

2024-06-24 00:30:00

2017-08-01 05:44:10

Dockerweave虛擬機(jī)

2009-10-12 13:22:15

unique列

2017-06-23 11:20:00

DockerWeave內(nèi)核

2021-09-27 07:56:41

MyBatis Plu數(shù)據(jù)庫批量插入

2021-06-30 07:08:14

安全解決方案XDR安全技術(shù)

2015-12-02 15:35:08

Redis Clust遷移解決方案

2012-05-27 16:21:31

IDC華為

2018-12-03 12:17:27

Semptian解決方案

2022-09-29 10:06:56

SQLMySQL服務(wù)端

2024-11-08 13:47:35

中文亂碼配置

2018-12-03 12:26:30

YADRO解決方案

2018-12-03 11:59:42

Inventec解決方案

2018-12-03 12:13:21

Mellanox解決方案

2023-09-08 06:52:56

生態(tài)系統(tǒng)流程技術(shù)

2025-03-25 08:20:00

Linux虛擬內(nèi)存系統(tǒng)
點(diǎn)贊
收藏

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

在线精品视频免费播放| 久久先锋影音av鲁色资源网| 久久成人精品电影| 亚洲国产精品狼友在线观看| 成人美女黄网站| 综合久久综合久久| 久久99精品久久久久子伦| 综合久久中文字幕| 欧美日韩亚洲一区| 中文国产亚洲喷潮| 视频免费在线观看| 97久久中文字幕| 欧美性猛交xxxxx水多| 综合久久国产| 久热av在线| 国产999精品久久久久久绿帽| 青青草99啪国产免费| 青青草成人免费| 第四色成人网| 亚洲精品一区中文| 成人一区二区三区仙踪林| 性欧美freehd18| 亚洲国产欧美在线人成| 永久久久久久| 福利小视频在线观看| 成人h动漫精品一区二区| 成人国产精品一区| 亚洲精品国产欧美在线观看| 亚洲精品韩国| 欧美国产第一页| 天天鲁一鲁摸一摸爽一爽| 奇米狠狠一区二区三区| 亚洲二区中文字幕| 国产精品偷伦视频免费观看了| 精品sm在线观看| 国产69久久精品成人看| 深夜福利影院在线观看| 日韩在线观看| 中文字幕不卡在线视频极品| 五级黄高潮片90分钟视频| 国产91精品入| 日韩欧美高清在线| 黄色aaaaaa| 亚洲日本中文| 在线观看91av| 女人高潮一级片| 亚洲91在线| 欧美高清性hdvideosex| 国内国产精品天干天干| 深夜福利亚洲| 欧美精品乱码久久久久久| 15—17女人毛片| 久久亚洲国产精品尤物| 欧美日韩国产三级| 粉色视频免费看| 欧美成a人片免费观看久久五月天| 欧美在线你懂的| 嫩草影院国产精品| 欧美特黄色片| 91精品在线观看入口| 在线观看国产中文字幕| 亚洲日韩中文字幕一区| 欧美一区二区三区免费| wwwww在线观看| 国产成人在线中文字幕| 日韩av在线最新| 亚洲第一成人网站 | 国产噜噜噜噜久久久久久久久| 亚洲精品久久久久久久蜜桃| 秋霞国产午夜精品免费视频| 国产欧美久久久久久| 91久久精品国产91性色69| 狠狠狠色丁香婷婷综合激情| 超碰97在线资源| 日本波多野结衣在线| 91麻豆免费视频| 日本一区二区三区www| 日本成人在线播放| 一区二区三区加勒比av| 草草久久久无码国产专区| 在线日韩影院| 在线电影欧美成精品| av不卡中文字幕| 妖精一区二区三区精品视频 | 国产秀色在线www免费观看| 亚洲欧美电影一区二区| 免费观看美女裸体网站| 欧洲成人一区| 欧美成人在线直播| 自拍偷拍亚洲天堂| 91影院成人| 91精品国产高清自在线看超| 在线免费观看一区二区| av一本久道久久综合久久鬼色| 日韩在线三级| 男男gaygays亚洲| 欧洲一区在线观看| 人妻精品久久久久中文字幕69| 日韩人体视频| 欧美成人免费小视频| 99久热在线精品996热是什么| 蜜桃在线一区二区三区| 国产一区二区久久久| 337p日本欧洲亚洲大胆鲁鲁| 亚洲一区视频在线| 999精品视频在线| 7777精品| www.99久久热国产日韩欧美.com | 欧美性色欧美a在线播放| 原创真实夫妻啪啪av| 国产精品欧美三级在线观看| 欧美激情综合亚洲一二区| 欧美男人天堂网| 不卡的av电影| 美女在线免费视频| 成人福利一区二区| 精品1区2区在线观看| 成年人网站在线观看视频| 免费日韩av片| 好吊色欧美一区二区三区 | 亚洲日本一区二区三区| av免费在线播放网站| 大奶在线精品| 久色乳综合思思在线视频| 懂色av蜜臀av粉嫩av喷吹| av电影天堂一区二区在线 | 亚洲精品国产熟女久久久| 怡红院精品视频在线观看极品| 国产在线不卡精品| a黄色在线观看| 91久久免费观看| 欧美在线一级片| 黄色精品网站| 91免费在线观看网站| 黄色成人在线| 欧美日韩aaa| 中文字幕91视频| 日韩av中文字幕一区二区| 欧美日韩天天操| 亚洲优女在线| 日韩精品免费在线视频观看| 日本免费观看视| 成人综合在线网站| 免费在线看黄色片| 国产成人精品福利| 91黑丝高跟在线| 无码精品人妻一区二区三区影院| 亚洲综合在线免费观看| 中文字幕永久免费| 国产精品mm| 国产精品一区视频网站| gogo高清在线播放免费| 亚洲精品美女在线观看| 国产特黄大片aaaa毛片| caoporm超碰国产精品| 热99这里只有精品| 日韩激情网站| 国产精品v日韩精品| av电影在线观看| 91麻豆精品国产无毒不卡在线观看 | 九九热精品视频在线| 久久众筹精品私拍模特| 欧洲熟妇精品视频| 99精品全国免费观看视频软件| 国产欧美日韩视频| 综合久久2019| 亚洲精品乱码久久久久久金桔影视 | 国产精品成人一区二区三区电影毛片| 亚洲在线日韩| 天天综合色天天综合色hd| 日本精品久久| 色综合久久中文字幕综合网小说| 欧美性受xxxx狂喷水| 欧美性猛交xxxx偷拍洗澡| 亚洲一级黄色录像| 国产精品亚洲午夜一区二区三区 | 欧美电影免费提供在线观看| 日本免费观看视| 国产夜色精品一区二区av| 爱爱爱爱免费视频| 国产精品分类| 日韩精品一区二区三区四区五区 | 麻豆freexxxx性91精品| 久久观看最新视频| 亚洲区小说区图片区qvod按摩| 国产精品久久久久久久久久ktv | 农村少妇久久久久久久| 欧美性猛交xxxx黑人| 99自拍视频在线| xf在线a精品一区二区视频网站| www.色就是色| 伊人久久大香线蕉av超碰演员| 日韩亚洲不卡在线| 日韩黄色av| 国产精品视频播放| 96av在线| 久久久精品2019中文字幕神马| 人妻视频一区二区三区| 欧美日韩一区成人| 久久精品一二区| 亚洲精品视频免费观看| 免费看污片的网站| 不卡电影一区二区三区| 午夜啪啪小视频| 久久精品亚洲一区二区| 国产精品自拍合集| 日本久久一二三四| 欧美成ee人免费视频| 7777精品| 91国产在线免费观看| 国产成人精品一区二三区在线观看| 美女999久久久精品视频| 国产免费a∨片在线观看不卡| 欧美xxxxxxxx| 国产丝袜在线视频| 欧美日韩精品专区| 东京热一区二区三区四区| 一区二区三区欧美在线观看| 黄色片网站在线播放| 国产欧美一区二区精品性色| 黄色正能量网站| 9久草视频在线视频精品| 日本中文字幕在线不卡| 精品系列免费在线观看| 免费黄色一级网站| 免费欧美日韩| heyzo国产| 在线视频精品| 欧美日韩在线一| 韩国av一区| 国内少妇毛片视频| 欧美日韩精品一本二本三本| 亚洲一区二区三区欧美| 波多野结衣在线观看一区二区三区| 久草热久草热线频97精品| 国产精品巨作av| 国产另类第一区| 成人高潮视频| 国产伦精品一区| 国产精品香蕉| 国产日韩一区欧美| 欧美91在线| 久久riav| 伊人久久大香线蕉无限次| 欧美激情第一页在线观看| 西野翔中文久久精品字幕| 久久综合九色综合久99| 亚洲精品推荐| 青青成人在线| 日韩欧美三级| 男女h黄动漫啪啪无遮挡软件| 91成人影院| 亚洲熟妇无码av在线播放| 亚洲精品色图| 国产真实乱子伦| 日本vs亚洲vs韩国一区三区 | 日本a级片在线观看| 欧美在线免费一级片| 加勒比海盗1在线观看免费国语版| 亚洲一区二区| 免费毛片网站在线观看| 一区二区三区四区五区精品视频 | 精品一区二区三区在线播放视频| 特黄视频免费观看| 丰满岳乱妇一区二区三区| 50一60岁老妇女毛片| 久久综合久久久久88| 日本美女bbw| 亚洲另类一区二区| 国产精品二区一区二区aⅴ| 亚洲高清视频在线| 久久久久99精品成人片三人毛片| 色视频成人在线观看免| 中文字幕欧美人妻精品一区蜜臀| 91精品一区二区三区在线观看| 亚洲第一色网站| 精品视频久久久久久| 日本在线人成| 午夜精品国产精品大乳美女| 欧美成人ⅴideosxxxxx| 成人黄色在线免费| 福利片一区二区| 天天爽天天狠久久久| 一区福利视频| 国产xxxxx在线观看| 久久97超碰色| 日韩网站在线播放| 亚洲日本中文字幕区| 探花视频在线观看| 欧美一区三区二区| 韩国中文免费在线视频| 欧美老女人性生活| 91精品xxx在线观看| 999精品在线观看| 狠狠色丁香婷婷综合影院| 成人免费a级片| 老司机午夜精品| 亚洲av网址在线| 亚洲码国产岛国毛片在线| 欧美精品韩国精品| 欧美va亚洲va| 黄视频在线观看网站| 日本中文字幕不卡免费| 欧美日韩中出| 亚洲精品一区二区毛豆| 一区二区三区国产盗摄| 中国特级黄色片| 综合网在线视频| 中文在线观看av| 亚洲精品少妇网址| 黄页网站在线| 成人免费大片黄在线播放| 国内精品伊人久久久| 成人黄色av片| 成人午夜伦理影院| 成人免费毛片xxx| 欧美日韩激情一区二区| 国产在线高清| 欧美中文在线观看国产| 成人动漫视频| 青青在线免费观看| 国产高清在线精品| 三级黄色免费观看| 欧美久久久一区| 1769在线观看| 国产精品视频在线播放| 奇米色欧美一区二区三区| av动漫在线观看| 2020国产成人综合网| 青青草成人av| 亚洲精品成人av| 成人免费观看在线观看| 成人av网站观看| 欧美1区2区视频| 在线观看你懂的视频| 亚洲欧美日韩国产中文在线| 99久久精品免费看国产交换| 久久精品视频va| 成人97精品毛片免费看| 久久av秘一区二区三区| 国精产品一区一区三区mba桃花| 国产精品久久免费观看| 欧美日本不卡视频| 欧美激情视频在线播放| 亚洲wwwav| 欧美成人中文| 好吊操视频这里只有精品| 亚洲午夜久久久久久久久久久| 亚洲国产一二三区| 91精品国产色综合| 精品在线播放| 爱情岛论坛亚洲首页入口章节| 国产精品高潮呻吟| 国产高清在线免费| 久久久国产一区| 国产精品高潮呻吟久久久久| 久久久久久久激情| 国产午夜三级一区二区三| 亚洲最大成人av| 精品少妇一区二区30p| 国产精品丝袜在线播放| www黄色av| 中文字幕一区三区| 精品黑人一区二区三区国语馆| 欧美高清自拍一区| 伊人成综合网yiren22| 国产一伦一伦一伦| 亚洲综合久久av| 亚洲三级黄色片| 国产精品自产拍在线观看| 中文字幕乱码亚洲无线精品一区| 天堂www中文在线资源| 日本久久电影网| 福利视频在线| 蜜桃精品久久久久久久免费影院| 日本欧美一区二区| 国产亚洲精品久久久久久打不开| 日韩电影中文字幕在线| 久久久久黄色| 日本一道本久久| 亚洲手机成人高清视频| 色婷婷av一区二区三| 国产欧美日韩视频| 亚洲人成久久| 国产精品夜夜夜爽阿娇| 亚洲成人精品av| 成人在线免费电影网站| 亚洲人精品午夜射精日韩| 国产精品乱人伦一区二区| 人妻妺妺窝人体色www聚色窝| 国产精品网址在线| 夜夜嗨av一区二区三区网站四季av| 少妇一级黄色片| 亚洲第一中文字幕在线观看| 玖玖精品在线| 成人免费观看毛片| 一区二区三区在线免费观看| 国产区视频在线播放| 国产综合欧美在线看| 国产美女精品人人做人人爽|