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

MyBatis批量插入幾千條數據慎用foreach

開發 后端
經排查發現,主要時間消耗在往 MyBatis 中批量插入數據。mapper configuration是用 foreach 循環做的,差不多是這樣。(由于項目保密,以下代碼均為自己手寫的demo代碼)。

近日,項目中有一個耗時較長的 Job 存在 CPU 占用過高的問題。

<insert id="batchInsert" parameterType="java.util.List">
insert into USER (id, name) values
<foreach collection="list" item="model" index="index" separator=",">
(#{model.id}, #{model.name})
</foreach>
</insert>

這個方法提升批量插入速度的原理是,將傳統的:

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");

轉化為:

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2"),
("data1", "data2"),
("data1", "data2"),
("data1", "data2"),
("data1", "data2");

在 MySql Docs:https://dev.mysql.com/doc/refman/5.6/en/insert-optimization.html中也提到過這個 trick,如果要優化插入速度時,可以將許多小型操作組合到一個大型操作中。理想情況下,這樣可以在單個連接中一次性發送許多新行的數據,并將所有索引更新和一致性檢查延遲到最后才進行。

乍看上去這個 foreach 沒有問題,但是經過項目實踐發現,當表的列數較多(20+),以及一次性插入的行數較多(5000+)時,整個插入的耗時十分漫長,達到了 14 分鐘,這是不能忍的。在[資料]https://stackoverflow.com/questions/19682414/how-can-mysql-insert-millions-records-fast中也提到了一句話:

?

Of course don't combine ALL of them, if the amount is HUGE. Say you have 1000 rows you need to insert, then don't do it one at a time. You shouldn't equally try to have all 1000 rows in a single query. Instead break it into smaller sizes.

?

它強調,當插入數量很多時,不能一次性全放在一條語句里。可是為什么不能放在同一條語句里呢?這條語句為什么會耗時這么久呢?我查閱了[資料]https://stackoverflow.com/questions/32649759/using-foreach-to-do-batch-insert-with-mybatis/40608353發現:

?

「Insert inside Mybatis foreach is not batch」, this is a single (could become giant) SQL statement and that brings drawbacks:

  • some database such as Oracle here does not support.
  • in relevant cases: there will be a large number of records to insert and the database configured limit (by default around 2000 parameters per statement) will be hit, and eventually possibly DB stack error if the statement itself become too large.

Iteration over the collection must not be done in the mybatis XML. Just execute a simple Insertstatement in a Java Foreach loop. 「The most important thing is the session Executor type」.

SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
for (Model model : list) {
session.insert("insertStatement", model);
}
session.flushStatements();

Unlike default ExecutorType.SIMPLE, the statement will be prepared once and executed for each record to insert.

?

從[資料]https://blog.csdn.net/wlwlwlwl015/article/details/50246717中可知,默認執行器類型為Simple,會為每個語句創建一個新的預處理語句,也就是創建一個「PreparedStatement」對象。在我們的項目中,會不停地使用批量插入這個方法,而因為MyBatis對于含有<foreach>的語句,無法采用緩存,那么在每次調用方法時,都會重新解析sql語句。

?

Internally, it still generates the same single insert statement with many placeholders as the JDBC code above.

MyBatis has an ability to cache PreparedStatement, but this statement cannot be cached because it contains <foreach /> element and the statement varies depending on the parameters.  

As a result, MyBatis has to 1) evaluate the foreach part and 2) parse the statement string to build parameter mapping [1] on every execution of this statement.  

And these steps are relatively costly process when the statement string is big and contains many placeholders.

[1] simply put, it is a mapping between placeholders and the parameters.

?

從上述[資料] http://blog.harawata.net/2016/04/bulk-insert-multi-row-vs-batch-using.html 可知,耗時就耗在,由于我 foreach 后有 5000+ 個 values,所以這個PreparedStatement 特別長,包含了很多占位符,對于占位符和參數的映射尤其耗時。并且,查閱相關[資料]https://www.red-gate.com/simple-talk/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load-methods 可知,values 的增長與所需的解析時間,是呈指數型增長的。

所以,如果非要使用 foreach 的方式來進行批量插入的話,可以考慮減少一條 insert 語句中 values 的個數,最好能達到上面曲線的最底部的值,使速度最快。一般按[經驗]https://stackoverflow.com/questions/7004390/java-batch-insert-into-mysql-very-slow來說,一次性插 20~50 行數量是比較合適的,時間消耗也能接受。

重點來了。上面講的是,如果非要用<foreach>的方式來插入,可以提升性能的方式。而實際上,MyBatis文檔中寫批量插入的時候,是推薦使用另外一種方法。(可以看http://www.mybatis.org/mybatis-dynamic-sql/docs/insert.html中 「Batch Insert Support」 標題里的內容)

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
SimpleTableMapper mapper = session.getMapper(SimpleTableMapper.class);
List<SimpleTableRecord> records = getRecordsToInsert(); // not shown
BatchInsert<SimpleTableRecord> batchInsert = insert(records)
.into(simpleTable)
.map(id).toProperty("id")
.map(firstName).toProperty("firstName")
.map(lastName).toProperty("lastName")
.map(birthDate).toProperty("birthDate")
.map(employed).toProperty("employed")
.map(occupation).toProperty("occupation")
.build()
.render(RenderingStrategy.MYBATIS3);
batchInsert.insertStatements().stream().forEach(mapper::insert);
session.commit();
} finally {
session.close();
}

即基本思想是將MyBatis session的executor type設為 「Batch」,然后多次執行插入語句。就類似于 JDBC 的下面語句一樣。

Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=false&rewriteBatchedStatements=true","root","root");
connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement(
"insert into tb_user (name) values(?)");
for (int i = 0; i < stuNum; i++) {
ps.setString(1,name);
ps.addBatch();
}
ps.executeBatch();
connection.commit();
connection.close();

經過試驗,使用了ExecutorType.BATCH的插入方式,性能顯著提升,不到 2s 便能全部插入完成。

總結一下,如果 MyBatis 需要進行批量插入,推薦使用ExecutorType.BATCH的插入方式,如果非要使用<foreach>的插入的話,需要將每次插入的記錄控制在 20~50 左右。

責任編輯:龐桂玉 來源: Java后端技術
相關推薦

2021-09-27 07:56:41

MyBatis Plu數據庫批量插入

2021-11-02 14:46:50

數據

2021-11-19 11:50:48

MyBatisforeachJava

2024-04-15 08:30:53

MySQLORM框架

2022-09-29 10:06:56

SQLMySQL服務端

2021-10-09 06:59:36

技術MyBatis數據

2023-12-30 20:04:51

MyBatis框架數據

2021-11-01 22:29:28

Python數據單身

2013-04-01 15:03:58

Android開發Android批量插入

2024-04-17 08:18:22

MyBatis批量插入SQL

2020-07-28 08:31:05

數據分析技術IT

2024-07-31 09:56:20

2024-03-07 08:08:51

SQL優化數據

2011-08-11 14:15:23

SQL Server索引碎片

2023-06-07 08:00:00

MySQL批量插入

2021-10-18 07:58:33

MyBatis Plu數據庫批量插入

2021-04-08 10:55:53

MySQL數據庫代碼

2020-07-19 21:26:48

網絡安全程序員技術

2011-08-04 18:00:47

SQLite數據庫批量數據

2018-06-21 09:12:01

編程語言Python數據分析
點贊
收藏

51CTO技術棧公眾號

中文字幕影音在线| 国产乱人乱偷精品视频a人人澡| 久9re热视频这里只有精品| 亚洲一线二线三线久久久| 国产精品爽黄69| 欧美爱爱免费视频| 风间由美中文字幕在线看视频国产欧美| 亚洲欧美自拍偷拍色图| 亚洲最大的av网站| 日韩乱码一区二区| 加勒比久久综合| 欧美一级久久久| 欧美精品久久久久久久自慰| 免费人成黄页在线观看忧物| 久久精品国产亚洲高清剧情介绍| 欧美另类在线播放| 国产呦小j女精品视频| 亚洲精品永久免费视频| 国产精品久久午夜| 成人在线看片| 久久久久亚洲av成人毛片韩| 国产高清一区二区| 亚洲第一视频网站| 欧美精品成人网| av在线免费播放| 久久久久99精品一区| 91中文字幕在线| 一本一道无码中文字幕精品热| 99久久99久久精品国产片桃花 | 国产亚洲精品高潮| 国产精品视频黄色| 大香伊人中文字幕精品| 日本一区二区三区四区| 成人情视频高清免费观看电影| 福利网址在线观看| 黄色一区二区三区四区| 亚洲欧洲视频在线| 精品无码av一区二区三区| 草民电影神马电影一区二区| 亚洲第一福利一区| 日本老太婆做爰视频| 国产乱视频在线观看| 成人久久久精品乱码一区二区三区| 国产精品欧美风情| 中日韩精品视频在线观看| 亚洲一本二本| 正在播放欧美一区| 中文字幕免费看| 91精品短视频| 欧美一区二区三区免费视频| 中国黄色片免费看| 啊啊啊久久久| 亚洲国产乱码最新视频| 免费极品av一视觉盛宴| 国产乱理伦片a级在线观看| 97久久超碰国产精品| 电影午夜精品一区二区三区| 国产男女无套免费网站| 美国一区二区三区在线播放 | 国产精品xxx| 黄色精品一区二区| 91免费黄视频| 91老司机福利在线| 亚洲午夜视频在线观看| 日本大片免费看| 色爱综合区网| 亚洲一二三四区| 日韩精品一区二区在线视频| 美女隐私在线观看| 一色桃子久久精品亚洲| 一区二区视频在线观看| 福利成人在线观看| 国产日韩欧美在线一区| 日本一区二区三区四区高清视频| 青青草手机在线| 91看片淫黄大片一级| 99在线视频首页| 丁香花免费高清完整在线播放| 国产不卡在线播放| 国产精品久久久久久久小唯西川| 精品国产av一区二区| 国产一区二区三区不卡在线观看| 成人激情在线播放| 国产白浆在线观看| www..com久久爱| 久久久久免费网| 国家队第一季免费高清在线观看| 国产亚洲欧洲997久久综合| 视频一区免费观看| 草碰在线视频| 亚洲精品免费看| 人妻少妇精品无码专区二区| 正在播放日韩精品| 狠狠久久亚洲欧美专区| 国产三级三级三级看三级| 91在线成人| 日韩欧美高清dvd碟片| 人妻av一区二区| 欧美a大片欧美片| 亚洲欧美日韩天堂| 国产成人av免费在线观看| 午夜性色一区二区三区免费视频| 久久免费国产精品1| 波多野结衣视频网站| 蜜臂av日日欢夜夜爽一区| 亚洲专区国产精品| 少妇精品视频一区二区| 99久久99久久久精品齐齐| 日韩欧美视频一区二区| 污污的网站在线免费观看| 一区二区三区.www| 久久精品99国产| 日本国产一区| 亚洲精品大尺度| 免费一级suv好看的国产网站| 欧美特黄a级高清免费大片a级| 欧美在线视频免费观看| 国产老女人乱淫免费| 成人国产在线观看| 亚洲在线色站| 九色porny视频在线观看| 欧美高清视频一二三区| 黄色在线观看av| 国产精品hd| 日韩av电影手机在线| 精品国产无码一区二区三区| 亚洲国产成人私人影院tom| 福利在线一区二区| 国产成人精品一区二区三区在线 | 97免费视频在线| 97超碰人人草| 久久精品欧美日韩| 精品久久久久久久久久中文字幕| 久久天天久久| 亚洲欧美日韩精品| 日韩三级小视频| 国产精品一区一区| 亚洲欧洲一区二区福利| 天堂在线中文网官网| 日韩欧美亚洲另类制服综合在线| 999久久久国产| 丝袜亚洲另类欧美综合| 精品国产区在线| 日本小视频在线免费观看| 欧美日韩国产电影| 日本一区二区视频在线播放| 欧美精品色网| 91在线视频精品| 成人在线免费看| 一本色道久久综合亚洲精品按摩| 久久出品必属精品| 国产大片一区| 国产精品网站大全| 高清在线观看av| 亚洲精品中文字幕在线观看| 九色porny自拍| 97精品国产| 国产精品欧美在线| 成人高清免费观看mv| 色域天天综合网| 老司机福利av| 国产九九精品| 蜜桃网站成人| 91在线成人| 久热精品视频在线观看一区| 精品美女www爽爽爽视频| 一区二区欧美在线观看| 天堂www中文在线资源| 国产伦理一区| 亚洲欧洲日本国产| 欧美影院在线| 91精品国产乱码久久久久久久久 | 久久久久久久久久看片| 手机在线免费观看毛片| 99热精品久久| 成人羞羞视频免费| 国产精品av一区二区三区 | 久久久久网址| 国产福利91精品一区二区| 精品国产网站地址| 国产91免费在线观看| 色综合久久88色综合天天免费| 麻豆视频免费在线播放| 国产乱色国产精品免费视频| 免费看国产一级片| 日韩夫妻性生活xx| 国产高清在线一区二区| 性欧美gay| 久久影视电视剧免费网站| 天天综合永久入口| 欧美日韩五月天| 久久精品久久精品久久| 国产日韩成人精品| 色婷婷狠狠18禁久久| 乱人伦精品视频在线观看| 潘金莲一级淫片aaaaa免费看| 欧美wwwwww| 国产精品视频成人| jizz一区二区三区| 中文国产成人精品久久一| 精品国产伦一区二区三区| 欧美影视一区在线| 日韩精品一区二区在线播放| 一区在线观看视频| 亚洲av综合一区二区| 国产精品18久久久久久久久| 日日碰狠狠丁香久燥| 欧美日韩国产一区精品一区| 日韩精品久久久毛片一区二区| 天堂精品久久久久| 国产精品入口夜色视频大尺度| av香蕉成人| 自拍视频国产精品| 欧美女优在线| 亚洲精品在线免费观看视频| 91禁在线观看| 91激情五月电影| 日韩少妇裸体做爰视频| 一区二区三区在线免费观看| 韩国三级hd中文字幕| 不卡视频在线观看| www.四虎精品| 国内外成人在线视频| 精品一卡二卡三卡| 国产精品一区亚洲| 国产午夜福利在线播放| 欧美日韩精选| 日本老太婆做爰视频| 久久大综合网| 性欧美精品一区二区三区在线播放| 欧美久久香蕉| 国产精品二区二区三区| 国产精品亚洲综合在线观看| 国产精品久久久久国产a级| 少妇一区视频| 日韩女优人人人人射在线视频| 999福利在线视频| 欧美精品国产精品日韩精品| 国产一二三区在线观看| 日韩一区在线视频| 成人免费高清在线播放| 尤物九九久久国产精品的分类| 狠狠v欧美ⅴ日韩v亚洲v大胸 | 岛国在线大片| 国产亚洲精品久久久优势| 国产免费永久在线观看| 一本色道久久综合亚洲精品小说 | 教室别恋欧美无删减版| 欧美日韩一区二区视频在线| 外国成人在线视频| 欧美一区二区福利| 国产精品一区二区av日韩在线| 欧美日韩无遮挡| 日本大胆欧美| 一级黄色免费在线观看| 亚洲精品中文字幕乱码| 天堂v在线视频| 欧美日韩亚洲一区二区三区在线| 国产手机视频在线观看| 欧美日韩一区二区国产| 毛片在线播放视频| 免费亚洲网站| 日本久久久久久久久久久久| 美女视频一区二区| 欧美性猛交xxxx乱大交91| 国产成人午夜99999| 国产高清成人久久| 91免费国产视频网站| www.av天天| 自拍偷在线精品自拍偷无码专区| 精品爆乳一区二区三区无码av| 亚洲成人自拍网| 国产一级一级国产| 欧美另类一区二区三区| 精品人妻一区二区三区日产乱码| 亚洲国产精品电影在线观看| 九色视频在线播放| 久久久精品免费| 电影k8一区二区三区久久| 欧美在线视频播放| 日韩国产一二三区| 国产精品对白刺激久久久| 国产欧美一区二区三区精品观看| 伊人久久大香线蕉午夜av| 欧美体内she精视频在线观看| 91专区在线观看| 久久狠狠亚洲综合| 91超薄肉色丝袜交足高跟凉鞋| 久久久欧美精品sm网站| 国产免费一区二区三区四区| 亚洲一区二区三区中文字幕在线| 日日夜夜操视频| 欧美一区二区三区在线| 无码精品黑人一区二区三区| 中文字幕亚洲一区二区三区五十路| 顶级网黄在线播放| 日韩av片永久免费网站| 亚洲综合色婷婷在线观看| 免费在线一区二区| 欧美激情第10页| 亚洲狼人综合干| 99精品视频一区二区三区| 99久久精品久久亚洲精品| 婷婷六月综合网| 国产精品久久777777换脸| 亚洲精品中文字| 伊人影院在线视频| 国产精品影片在线观看| 欧美电影在线观看完整版| 中日韩在线视频| 久久先锋影音| 色婷婷狠狠18禁久久| 国产精品美女久久久久aⅴ国产馆| 国产午夜精品无码一区二区| 欧美精品xxxxbbbb| 国产毛片av在线| 欧美一级电影免费在线观看| 日韩第一区第二区| 午夜一区二区三区| 久久久久免费| 妖精视频一区二区| 亚洲一区二区美女| 国产ts人妖调教重口男| 日韩在线观看免费av| 吞精囗交69激情欧美| 国产一区二区三区色淫影院| 自拍日韩欧美| 涩涩网站在线看| 国产精品毛片高清在线完整版| 国产精品久久久久久久久久久久久久久久久 | 国产天堂素人系列在线视频| 久久久久久国产精品三级玉女聊斋| 一区在线不卡| 一区二区不卡视频| 麻豆极品一区二区三区| 精品人妻一区二区三区四区| 色婷婷激情综合| 裸体xxxx视频在线| 国产91九色视频| 在线观看欧美理论a影院| 国产一区二区在线视频播放| www.成人网.com| 亚洲男人第一av| 日韩精品中文字幕在线观看| 蜜臀久久精品| 欧美日韩在线高清| 日本欧美大码aⅴ在线播放| 亚洲精品午夜视频| 欧美亚洲动漫制服丝袜| 天天综合视频在线观看| 国产在线精品自拍| 亚洲一级淫片| 国产清纯白嫩初高中在线观看性色| 亚洲在线观看免费视频| 亚洲av无码乱码国产精品久久| 久久久久成人精品| 欧洲亚洲视频| 亚洲乱码国产一区三区| 国产欧美精品一区二区色综合朱莉| 中文字幕乱码人妻二区三区| 色多多国产成人永久免费网站| 亚州精品国产| 日韩精品一区二区在线视频| 99r精品视频| 日本黄色中文字幕| 久久久精品视频在线观看| 亚洲一二三区视频| 日韩在线视频在线观看| 国产日韩v精品一区二区| 国产女人爽到高潮a毛片| 久久久亚洲精品视频| 亚洲涩涩av| 小明看看成人免费视频| 亚洲精品一二三| 天天操天天射天天| 国产精品av免费在线观看| 中出一区二区| 色婷婷免费视频| 欧美理论片在线| 好吊日av在线| 日韩精品另类天天更新| 国产一区二区三区在线看麻豆| 成人免费看片98| 亚洲香蕉av在线一区二区三区| 欧美视频在线视频精品| 亚洲人成无码网站久久99热国产| 久久久久国产成人精品亚洲午夜| 国产精品-色哟哟| 午夜精品久久久久久久99黑人| 奇米色欧美一区二区三区| www.污网站| 91黄色免费网站| 在线视频中文字幕第一页| 欧美日韩无遮挡| 国产成人精品网址| 中文字幕精品无| 欧美贵妇videos办公室| 成人久久电影| 黄色片视频免费观看| 在线不卡欧美精品一区二区三区|