日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql基础----mybatis的批量插入(一)

發(fā)布時(shí)間:2023/12/20 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql基础----mybatis的批量插入(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  這里面記錄一下使用mybatis處理mysql的批量插入的問(wèn)題,測(cè)試有可能不準(zhǔn)。只愿世間風(fēng)景千般萬(wàn)般熙攘過(guò)后,字里行間,人我兩忘,相對(duì)無(wú)言。

?

mybatis的批量插入

我們的測(cè)試主體類(lèi)是springboot環(huán)境中的一個(gè)控制器類(lèi),重要的代碼如下,在我們的測(cè)試中Constants.MAX_BATCH_NUMBER = 10000。

@GetMapping("insert") public void insertBatchData() {// 構(gòu)建一個(gè)list,大小為1百萬(wàn)條數(shù)據(jù)long beginCreateList = System.currentTimeMillis();List<Map<String, Object>> lists = new ArrayList<>();for (int i = 0; i < 100000; i ++) {Map<String, Object> map = new HashMap<>();map.put("userId", i + "");map.put("username", "huhx" + i);map.put("password", "124" + i);map.put("sex", 1);map.put("address", System.currentTimeMillis());lists.add(map);}long endCreateList = System.currentTimeMillis();logger.debug("創(chuàng)建一個(gè)大小為10萬(wàn)的列表,耗時(shí):" + (endCreateList - beginCreateList)); // 4103// 插入數(shù)據(jù)dbSessionTemplateSupport.simpleSqlInsertBatch("user.simpleInsertUserData", lists);long endInsertData = System.currentTimeMillis();logger.debug("插入10萬(wàn)數(shù)據(jù),耗時(shí):" + (endInsertData - endCreateList)); // 49649 }

?

一、我們每10000條數(shù)據(jù)提交一次事務(wù)

public class DbSessionTemplateSupport extends SqlSessionTemplate {public DbSessionTemplateSupport(SqlSessionFactory sqlSessionFactory) {super(sqlSessionFactory);}// 支持批量的插入public void baseInsertBatch(String sqlStatement, List<Map<String, Object>> list) {SqlSession session = getSqlSessionFactory().openSession(ExecutorType.BATCH, false);if (list == null || list.size() < 1) {return;}int listSize = list.size();try {// 如果提交的列表?xiàng)l數(shù)小于提交閥值if (listSize <= Constants.MAX_BATCH_NUMBER) {for (int i = 0; i < list.size(); i++) {session.insert(sqlStatement, list.get(i));}session.commit();} else {for (int i = 0; i < list.size(); ) {session.insert(sqlStatement, list.get(i));i++;if (i % Constants.MAX_BATCH_NUMBER == 0 || i == listSize) {session.commit();session.clearCache();}}}} catch (Exception e) {session.rollback();e.printStackTrace();} finally {session.close();}} }

這種方式處理插入,仍舊比較慢(其實(shí)是很慢很慢,可能是我的代碼問(wèn)題,沒(méi)有統(tǒng)計(jì)時(shí)間,太慢了)。但是這種方式可以支持oracle,下面的這種方式非常快,但是oracle不支持。

?

二、采用mysql支持的拼接式插入數(shù)據(jù)

/*** mysql的批量插入方式,oracle不支持。** @param sqlStatement* @param list*/ public void simpleSqlInsertBatch(String sqlStatement, List<Map<String, Object>> list) {if (list == null || list.size() < 1) {return;}// 如果提交的列表?xiàng)l數(shù)小于提交閥值List<Map<String, Object>>[] splitLists = CommUtil.splitLists(list, Constants.MAX_BATCH_NUMBER);for (List<Map<String, Object>> tempList : splitLists) {insert(sqlStatement, tempList);} }

我們對(duì)原始的列表進(jìn)行切割,然后依次的插入。每次的插入都是MAX_BATCH_NUMBER條數(shù)據(jù)。下面是切割的方法

/*** 對(duì)一個(gè)列表按照splitNum進(jìn)行分割。** @param lists* @param splitNum* @param <T>* @return*/ public static <T> List<T>[] splitLists(List<T> lists, int splitNum) {int listSize;if (lists == null || (listSize = lists.size()) < 1) {return new ArrayList[0];}int length = listSize % splitNum == 0 ? listSize / splitNum : listSize / splitNum + 1;// 這里面如果用ArrayList,會(huì)在50行報(bào)錯(cuò)。ArrayList list = new List();這樣會(huì)報(bào)錯(cuò)。List<T>[] results = new List[length];int fromIndex, toIndex;for (int i = 0; i < length; i++) {fromIndex = i * splitNum;toIndex = (fromIndex + splitNum) > listSize ? listSize : (fromIndex + splitNum);results[i] = lists.subList(fromIndex, toIndex);}return results; }

插入的sql語(yǔ)句在mybatis中是使用for...each的方式,如下:

<!-- mysql的批量插入方式 --> <insert id="simpleInsertUserData" parameterType="java.util.List">INSERT INTO puser(userId, username, password, address, sex)VALUES<foreach collection ="list" item="item" index= "index" separator =",">(#{item.userId},#{item.username},#{item.password},#{item.address},#{item.sex})</foreach > </insert>

?10萬(wàn)條數(shù)據(jù)的分割時(shí)間加上插入到mysql數(shù)據(jù)庫(kù),這種方式耗時(shí):15658毫秒。需要注意的是如果常數(shù)設(shè)置為10萬(wàn)條,也就是第10萬(wàn)插入一次。這種方式會(huì)報(bào)錯(cuò)的。

?

友情鏈接

?

轉(zhuǎn)載于:https://www.cnblogs.com/huhx/p/baseusemysqlbatchinsert1.html

總結(jié)

以上是生活随笔為你收集整理的mysql基础----mybatis的批量插入(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。