精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久久久女教师免费一区| 亚洲国产精品t66y| 久久久久久久久国产| 成年人性生活视频| 成人高潮aa毛片免费| 国产成a人亚洲| 久久久亚洲国产| 国产传媒第一页| 在线日本欧美| 亚洲激情图片一区| 国产精品一码二码三码在线| www.99re7.com| 免费一区二区| 欧美精品久久久久久久多人混战| 国产免费内射又粗又爽密桃视频| 亚洲精品一级片| 男女av一区三区二区色多| 亚洲摸下面视频| www.久久91| 欧美日韩xx| 99国产精品国产精品毛片| 国产精品电影一区| 校园春色 亚洲| 国产在线日韩精品| 欧美性极品少妇| 国产香蕉一区二区三区| 色综合成人av| 极品少妇xxxx精品少妇| 97久久伊人激情网| 林心如三级全黄裸体| 99久久香蕉| 日本韩国欧美国产| 黄网站色视频免费观看| 国产视频福利在线| 国产高清久久久| 国产精品美女免费| 91蜜桃视频在线观看| 国产精品黑丝在线播放| 日韩精品中文字| 日韩精品在线播放视频| 最新欧美电影| 亚洲一区二区黄色| 一级黄色免费在线观看| 久久国产精品高清一区二区三区| 国产91精品一区二区| 国产精品啪视频| 国产视频91在线| 亚洲国产精品日韩专区av有中文 | 亚洲在线观看| 欧美日韩第一视频| 一本色道久久88| 中文有码一区| 亚洲精品按摩视频| 午夜一级免费视频| 成人午夜sm精品久久久久久久| 亚洲欧美另类久久久精品2019| 欧美日韩亚洲在线| 亚洲人在线观看视频| 懂色一区二区三区免费观看| 91精品久久久久久久久久久久久久 | 周于希免费高清在线观看| 亚洲日本乱码在线观看| 日本免费高清不卡| 男人av在线| 91在线视频免费观看| 成人做爰66片免费看网站| 国产精品久久婷婷| 蜜臀精品一区二区三区在线观看 | 亚洲国产欧美视频| 麻豆视频一区| 精品盗摄一区二区三区| www.四虎在线| ccyy激情综合| 欧美精品1区2区3区| 亚洲娇小娇小娇小| 成人一区视频| 欧美精品 日韩| 日本一本在线视频| 亚洲国产一区二区三区网站| 日韩一区二区免费在线电影| 日韩高清在线一区二区| 欧美h版在线观看| 欧美tickling挠脚心丨vk| 欧美图片自拍偷拍| 日韩精品一级| 欧美精品一区二区三区四区| 久久久久亚洲AV成人无码国产| 精品少妇一区| 亚洲图中文字幕| 亚洲激情图片网| 综合激情一区| 久久乐国产精品| 无码黑人精品一区二区| 国内精品久久久久久久影视麻豆| 欧美在线性视频| 国产又粗又猛又爽又黄91| 国产91精品在线观看| 欧美一区二区三区四区夜夜大片 | 国产特黄一级片| av男人天堂一区| 亚洲欧洲一区二区| heyzo在线播放| 欧美视频在线观看一区| 白丝校花扒腿让我c| 国产一卡不卡| 国语自产精品视频在免费| 精品乱码一区内射人妻无码| 成人免费毛片app| 日韩aⅴ视频一区二区三区| 91麻豆一二三四在线| 色先锋久久av资源部| 国产伦精品一区二区三区妓女下载 | 欧美久久久久中文字幕| 在线天堂www在线国语对白| 欧美hd在线| 3344国产精品免费看| 99久久精品国产色欲| 国产欧美日韩激情| 无码中文字幕色专区| 99精品美女视频在线观看热舞| 亚洲精品视频在线观看视频| 免费在线观看黄色av| 美女视频网站黄色亚洲| 欧美激情一区二区三区在线视频 | 精品久久久久久久| 性欧美在线看片a免费观看| 国产精品无码天天爽视频| 国产亚洲制服色| 男的插女的下面视频| vam成人资源在线观看| 永久免费看mv网站入口亚洲| 中文字幕亚洲精品在线| 成人在线一区二区三区| 自拍偷拍视频在线| 欧美aaaaaa| 国产午夜精品视频| 国产精品久久久久久久久久久久久久久久久 | 亚洲免费观看高清完整版在线观| 欧美国产第二页| 日韩欧美国产一区在线观看| 一区二区三区视频网| 色狼人综合干| 97视频在线观看网址| 高清乱码毛片入口| 亚洲精品免费在线观看| 久久精品网站视频| 国产一区二区观看| 日韩美女视频免费看| 日本韩国精品一区二区| 亚洲成人资源网| 国产大尺度视频| 在线成人av| 国产一区不卡在线观看| 国产蜜臀在线| 精品国产3级a| 日韩欧美中文字幕一区二区| 99在线热播精品免费| 131美女爱做视频| 亲子伦视频一区二区三区| 久久久视频免费观看| 人人妻人人澡人人爽精品日本| 亚洲国产美女搞黄色| 五月天丁香社区| 亚洲激情女人| 欧美精品一区二区三区四区五区| 伊人色综合一区二区三区影院视频| 日韩电影免费在线观看中文字幕| 亚洲欧美偷拍视频| 国产人成一区二区三区影院| 无限资源日本好片| 亚洲国产不卡| 国产日本一区二区三区| 成人免费无遮挡| 中文国产亚洲喷潮| 国产视频一二三四区| 亚洲一区二区三区四区在线| 天堂久久久久久| 丝瓜av网站精品一区二区| 一区二区三区的久久的视频| 日韩一级淫片| 欧美亚洲另类制服自拍| 高清日韩av电影| 91麻豆精品国产91久久久资源速度| 欧美人禽zoz0强交| 92精品国产成人观看免费| 久热免费在线观看| 91不卡在线观看| 精品999在线观看| 中韩乱幕日产无线码一区| 大胆欧美人体视频| 污视频在线免费观看| 欧美日韩在线亚洲一区蜜芽| 精品国产乱码久久久久久鸭王1| caoporn国产精品| 97超碰成人在线| 99在线|亚洲一区二区| 亚洲高清在线观看一区| 成人台湾亚洲精品一区二区 | 亚洲色图图片| 88xx成人精品| h片在线免费| 亚洲欧美成人一区二区在线电影| 国产伦子伦对白视频| 福利一区视频在线观看| 天天色天天综合| 91香蕉视频mp4| 欧美国产日韩在线视频| 三级欧美韩日大片在线看| 337p亚洲精品色噜噜狠狠p| 精品在线观看入口| 99r国产精品视频| 国产成人福利夜色影视| 午夜精品一区二区三区在线视频| 毛片在线播放a| 亚洲欧美色图片| 蜜桃av中文字幕| 欧美一区二区三区在线看 | 欧美老年两性高潮| 亚洲精品www久久久久久| 日韩毛片精品高清免费| 国产美女免费网站| av中文字幕在线不卡| 污污视频在线免费| 日本少妇一区二区| 尤物av无码色av无码| 欧美1区2区3区| 在线码字幕一区| 精品一区二区三| 欧美精品尤物在线| 丝袜连裤袜欧美激情日韩| 成人午夜电影在线播放| 电影一区中文字幕| 国产美女高潮久久白浆| 欧美精品总汇| 国产精品成人一区二区| 午夜裸体女人视频网站在线观看| 久久频这里精品99香蕉| 在线不卡日本v二区707| 久久网福利资源网站| 日本激情视频在线观看| 综合国产在线观看| av网站无病毒在线| 国产一区二区精品丝袜| 国产在线视频你懂得| 亚洲视频在线播放| 国产在线一二三区| 中文字幕久热精品视频在线| 黄色软件在线| 中文字幕av一区中文字幕天堂| 免费人成在线观看网站| 亚洲欧美成人一区二区在线电影| 黄网在线观看| 在线观看国产精品日韩av| 1769在线观看| 俺去啦;欧美日韩| 国产秀色在线www免费观看| 欧美成人三级视频网站| 天使と恶魔の榨精在线播放| 欧美激情免费视频| 波多野结衣久久| 5566日本婷婷色中文字幕97| 成人免费无遮挡| 国产精品网站大全| 24小时成人在线视频| 91精品视频免费| 成人18夜夜网深夜福利网| 激情欧美一区二区三区中文字幕| 伊人久久大香线蕉综合网蜜芽 | 91视频啊啊啊| 国产片一区二区| www日韩在线| 午夜婷婷国产麻豆精品| 日韩中文字幕高清| 欧美视频第二页| 91精品中文字幕| 精品动漫一区二区三区在线观看| 青青草手机在线| 日韩小视频网址| zzzwww在线看片免费| 国产成人精品免高潮在线观看| 亚洲一区有码| 精品一区二区三区自拍图片区 | 伊人免费在线观看高清版| 日韩一级完整毛片| 精品国产免费久久久久久婷婷| 丝袜美腿一区| 国产精品一区二区三区成人| 亚洲国产视频二区| 日本一区二区三区四区高清视频 | 日日碰狠狠躁久久躁婷婷| 精品一区二区在线视频| 中文字幕 日本| 中文字幕一区二区三区精华液| 久青草免费视频| 欧美日韩高清一区二区三区| 囯产精品一品二区三区| 在线播放精品一区二区三区| 色帝国亚洲欧美在线| 国产91色在线|免| 玖玖精品一区| 日韩av电影免费在线观看| 午夜激情久久| 成人在线免费播放视频| 精品一区二区三区蜜桃| 性欧美13一14内谢| 午夜视频在线观看一区二区三区 | av网址在线| 人人澡人人澡人人看欧美| 在线成人免费| 日韩高清dvd| 国产精品porn| 免费在线a视频| 激情综合亚洲精品| 亚洲色图14p| 亚洲一区精品在线| 超碰超碰超碰超碰| 日韩一级欧美一级| 国产在线视频网| 人人爽久久涩噜噜噜网站| 亚洲精品一区二区三区中文字幕 | 欧美精品aa| 日本激情视频在线播放| 91片在线免费观看| av激情在线观看| 一本色道综合亚洲| 亚州视频一区二区三区| 欧美成人激情图片网| 视频欧美精品| 中文字幕精品视频| 日本天堂中文字幕| 一本在线高清不卡dvd| 国产黄色一级大片| 久久精品一区中文字幕| 日韩毛片一区| 日韩久久久久久久| 亚洲专区欧美专区| www男人天堂| 亚洲国产视频a| www久久久com| 九九久久国产精品| 日韩黄色三级| 综合操久久久| 狠狠v欧美v日韩v亚洲ⅴ| www.av天天| 欧美亚洲日本国产| 国产高清自拍视频在线观看| 日本精品免费观看| 日韩精品导航| 免费一级特黄毛片| 不卡影院免费观看| 国产一级一片免费播放| 精品乱人伦小说| 天天色天天射天天综合网| 亚洲字幕在线观看| 欧美国产免费| 在线观看免费看片| 亚洲一区二区三区爽爽爽爽爽 | 欧洲亚洲一区二区| 老司机一区二区三区| 国产肉体xxxx裸体784大胆| 一区二区三区中文字幕电影 | 久久9热精品视频| 欧美一区免费观看| 欧美一级欧美一级在线播放| av在线官网| 99爱精品视频| 91久久综合| 国产毛片久久久久久久| 91成人国产精品| 日本激情在线观看| 91视频最新| 亚洲成人二区| 丰满少妇中文字幕| 一区二区三区 在线观看视频 | 成人在线视频首页| 国产无套粉嫩白浆内谢| 亚洲欧洲xxxx| 国产精品久久久久久妇女| 欧美日韩视频免费在线观看| 成人综合激情网| 黄瓜视频在线免费观看| 上原亚衣av一区二区三区| 精品视频在线观看免费观看| 日韩一级特黄毛片| 97se亚洲国产综合自在线| 日韩精品在线免费视频| 亚洲精品观看| 亚洲欧洲精品一区| 国产精品18久久久| 国产一级特黄aaa大片| 一区二区三区视频免费| 91国产一区| 国产精品www在线观看| 国产日韩精品一区二区浪潮av| 国产一区二区在线播放视频| 欧美另类第一页| 美女久久久久| 在线成人精品视频| 一本大道久久a久久精品综合| 久热av在线|