mybatis-plus 處理大數(shù)據(jù)插入太慢的解決
大批量數(shù)據(jù)插入方法是Mybatis的foreach拼接SQL
我發(fā)現(xiàn)不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,實(shí)際上在插入的時(shí)候仍然是一條條記錄的插,速度遠(yuǎn)不如原來Mybatis的foreach拼接SQL的方法。
// 第一步判斷更新或添加 String[] splitUserId = userGroup.getUserId().split(","); String[] spiltUserName = userGroup.getUserName().split(","); if (StringUtils.isBlank(userGroup.getId())) { userGroup.setNum(spiltUserName.length); userGroupMapper.insert(userGroup); } else { userGroup.setNum(spiltUserName.length); userGroupMapper.updateById(userGroup); } /* 第二部刪除中間表信息,字段冗余 */ Map<String, Object> columnMap = new HashMap<String, Object>(); columnMap.put("USER_GROUP_ID", userGroup.getId()); groupUsersService.removeByMap(columnMap); /* 第三步,批量保存中間表 */ if (splitUserId.length != 0) { List<GroupUsers> groupUsersList = Lists.newArrayList(); for (int i = 0; i < splitUserId.length; i++) { GroupUsers gu = new GroupUsers(); gu.setUserId(splitUserId[i]); gu.setUserName(spiltUserName[i]); gu.setUserGroupId(userGroup.getId()); groupUsersList.add(gu); } groupUsersService.saveBatch(groupUsersList); }
- 就是這樣的一種情景也很符合大部分的開發(fā)場景,可就是1000條數(shù)據(jù)的情況下用了8秒 ,這可能與計(jì)算機(jī)的性能有很大的關(guān)系,但就是如此也不至于用八秒鐘,那么用戶體驗(yàn)會(huì)很慘的。
- JDBC連接URL字符串中需要新增一個(gè)參數(shù):rewriteBatchedStatements=true url: jdbc:mysql://192.168.1.143:3306/rt_xxxxxx_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true
- MySQL的JDBC連接的url中要加rewriteBatchedStatements參數(shù),并保證5.1.13以上版本的驅(qū)動(dòng),才能實(shí)現(xiàn)高性能的批量插入。
- MySQL JDBC驅(qū)動(dòng)在默認(rèn)情況下會(huì)無視executeBatch()語句,把我們期望批量執(zhí)行的一組sql語句拆散,一條一條地發(fā)給MySQL數(shù)據(jù)庫,批量插入實(shí)際上是單條插入,直接造成較低的性能。
- 只有把rewriteBatchedStatements參數(shù)置為true, 驅(qū)動(dòng)才會(huì)幫你批量執(zhí)行SQL
- 另外這個(gè)選項(xiàng)對(duì)INSERT/UPDATE/DELETE都有效
其他原因:
問題
最近項(xiàng)目用的mybatis-plus做的映射,有個(gè)批處理文件內(nèi)容的需求,在使用mybatis-plus的批處理方法saveBatch時(shí)發(fā)現(xiàn)速度特別慢,測試從1000到10000到80000條基本上是線性增加,80000條時(shí)差不多要90秒。
排查
經(jīng)debug排查sql語句是批量執(zhí)行,所以應(yīng)該不是框架本身的問題,由于用的是公司的手腳架,在mysql連接配置中發(fā)現(xiàn)了問題
這里少配置了一個(gè)參數(shù)rewriteBatchedStatements=true
結(jié)果
修改前24w數(shù)據(jù)大概在254709 ms
修改后24w數(shù)據(jù)大概在42506 ms
單次批量插入10000條大概在1700ms
到此這篇關(guān)于mybatis-plus 處理大數(shù)據(jù)量太慢的解決的文章就介紹到這了,更多相關(guān)mybatis-plus 處理大數(shù)據(jù)太慢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)異步延遲隊(duì)列的方法詳解
目前系統(tǒng)中有很多需要用到延時(shí)處理的功能,本文就為大家介紹了Java實(shí)現(xiàn)異步延遲隊(duì)列的方法,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-03-03Springboot如何使用mybatis實(shí)現(xiàn)攔截SQL分頁
這篇文章主要介紹了Springboot使用mybatis實(shí)現(xiàn)攔截SQL分頁,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06多線程計(jì)數(shù),怎么保持計(jì)數(shù)準(zhǔn)確的方法
這篇文章主要介紹了多線程計(jì)數(shù)的方法,有需要的朋友可以參考一下2014-01-01java web項(xiàng)目里ehcache.xml介紹
java web項(xiàng)目里ehcache.xml介紹,需要的朋友可以參考一下2013-03-03Spring Boot系列教程之7步集成RabbitMQ的方法
RabbitMQ 即一個(gè)消息隊(duì)列,主要是用來實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖,消息分發(fā)的作用。下面這篇文章主要給大家介紹了關(guān)于Spring Boot之7步集成RabbitMQ的相關(guān)資料,需要的朋友可以參考下2018-11-11使用log4j2自定義配置文件位置和文件名(附log4j2.xml配置實(shí)例)
這篇文章主要介紹了使用log4j2自定義配置文件位置和文件名(附log4j2.xml配置實(shí)例),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java中字符串和byte數(shù)組之間的簡單轉(zhuǎn)換方法
這篇文章主要給大家介紹了關(guān)于Java中字符串和byte數(shù)組之間的簡單轉(zhuǎn)換方法,Java中將String類型轉(zhuǎn)換為byte[]類型,可以使用String的getBytes()方法,還有很多其他的辦法,需要的朋友可以參考下2023-08-08