mybatis-plus 處理大數(shù)據(jù)插入太慢的解決
大批量數(shù)據(jù)插入方法是Mybatis的foreach拼接SQL
我發(fā)現(xiàn)不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,實際上在插入的時候仍然是一條條記錄的插,速度遠不如原來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秒 ,這可能與計算機的性能有很大的關(guān)系,但就是如此也不至于用八秒鐘,那么用戶體驗會很慘的。
- JDBC連接URL字符串中需要新增一個參數(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ū)動,才能實現(xiàn)高性能的批量插入。
- MySQL JDBC驅(qū)動在默認情況下會無視executeBatch()語句,把我們期望批量執(zhí)行的一組sql語句拆散,一條一條地發(fā)給MySQL數(shù)據(jù)庫,批量插入實際上是單條插入,直接造成較低的性能。
- 只有把rewriteBatchedStatements參數(shù)置為true, 驅(qū)動才會幫你批量執(zhí)行SQL
- 另外這個選項對INSERT/UPDATE/DELETE都有效
其他原因:
問題
最近項目用的mybatis-plus做的映射,有個批處理文件內(nèi)容的需求,在使用mybatis-plus的批處理方法saveBatch時發(fā)現(xiàn)速度特別慢,測試從1000到10000到80000條基本上是線性增加,80000條時差不多要90秒。
排查
經(jīng)debug排查sql語句是批量執(zhí)行,所以應(yīng)該不是框架本身的問題,由于用的是公司的手腳架,在mysql連接配置中發(fā)現(xiàn)了問題
這里少配置了一個參數(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)文章
Springboot如何使用mybatis實現(xiàn)攔截SQL分頁
這篇文章主要介紹了Springboot使用mybatis實現(xiàn)攔截SQL分頁,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06多線程計數(shù),怎么保持計數(shù)準(zhǔn)確的方法
這篇文章主要介紹了多線程計數(shù)的方法,有需要的朋友可以參考一下2014-01-01Spring Boot系列教程之7步集成RabbitMQ的方法
RabbitMQ 即一個消息隊列,主要是用來實現(xiàn)應(yīng)用程序的異步和解耦,同時也能起到消息緩沖,消息分發(fā)的作用。下面這篇文章主要給大家介紹了關(guān)于Spring Boot之7步集成RabbitMQ的相關(guān)資料,需要的朋友可以參考下2018-11-11使用log4j2自定義配置文件位置和文件名(附log4j2.xml配置實例)
這篇文章主要介紹了使用log4j2自定義配置文件位置和文件名(附log4j2.xml配置實例),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Java中字符串和byte數(shù)組之間的簡單轉(zhuǎn)換方法
這篇文章主要給大家介紹了關(guān)于Java中字符串和byte數(shù)組之間的簡單轉(zhuǎn)換方法,Java中將String類型轉(zhuǎn)換為byte[]類型,可以使用String的getBytes()方法,還有很多其他的辦法,需要的朋友可以參考下2023-08-08