解決mybatis-plus 查詢耗時(shí)慢的問題
mybatis-plus 查詢耗時(shí)慢
1、現(xiàn)象
查出30000多條id
然后用
EntityWrapper ew = new EntityWrapper<>(); ew.in(TableFieldConstant.F_AUTH_RESULT_ID, ids);
查詢會(huì)很慢
2、原因
跟了一下mybatis-plus源碼
protected String formatSqlIfNeed(boolean need, String sqlStr, Object... params) {
if (need && !StringUtils.isEmpty(sqlStr)) {
if (ArrayUtils.isNotEmpty(params)) {
for(int i = 0; i < params.length; ++i) {
String genParamName = "MPGENVAL" + this.paramNameSeq.incrementAndGet();
sqlStr = sqlStr.replace(String.format("{%s}", i), String.format("#{%s.paramNameValuePairs.%s}", this.getParamAlias(), genParamName));
this.paramNameValuePairs.put(genParamName, params[i]);
}
}
return sqlStr;
} else {
return null;
}
}
問題出現(xiàn)在
sqlStr = sqlStr.replace(String.format("{%s}", i), String.format("#{%s.paramNameValuePairs.%s}", this.getParamAlias(), genParamName));
對(duì)replace 測(cè)試 發(fā)現(xiàn)當(dāng)數(shù)據(jù)量大時(shí)替換會(huì)很耗時(shí) 測(cè)試的遍歷了30000次拼接從1到30000 替換耗時(shí)20多秒
對(duì) apache-commons-lang 的StringUtis.replace測(cè)試是耗時(shí)7秒多
3、總結(jié)
把使用mybaits 批量查詢改為 手寫sql查詢 之后問題解決
使用mybatis-plus批量操作時(shí)要謹(jǐn)慎 能寫sql盡量寫sql
這個(gè)跟mybatis-plus 的小伙伴提了問題后已經(jīng)解決 可以升級(jí)jar版本 3.x
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);
}
1、就是這樣的一種情景也很符合大部分的開發(fā)場(chǎng)景,可就是1000條數(shù)據(jù)的情況下用了8秒 ,這可能與計(jì)算機(jī)的性能有很大的關(guān)系,但就是如此也不至于用八秒鐘,那么用戶體驗(yàn)會(huì)很慘的。
2、JDBC連接URL字符串中需要新增一個(gè)參數(shù):
rewriteBatchedStatements=true url: jdbc:mysql://192.168.1.143:3306/rt_xxxxxx_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true
3、MySQL的JDBC連接的url中要加rewriteBatchedStatements參數(shù),并保證5.1.13以上版本的驅(qū)動(dòng),才能實(shí)現(xiàn)高性能的批量插入。
4、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都有效
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Spring Security的詳細(xì)教程
這篇文章主要介紹了SpringBoot整合Spring Security的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Java中List排序的三種實(shí)現(xiàn)方法實(shí)例
其實(shí)Java針對(duì)數(shù)組和List的排序都有實(shí)現(xiàn),對(duì)數(shù)組而言你可以直接使用Arrays.sort,對(duì)于List和Vector而言,你可以使用Collections.sort方法,下面這篇文章主要給大家介紹了關(guān)于Java中List排序的三種實(shí)現(xiàn)方法,需要的朋友可以參考下2021-12-12
SpringBoot實(shí)現(xiàn)評(píng)論回復(fù)功能(數(shù)據(jù)庫設(shè)計(jì))
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)評(píng)論回復(fù)功能(數(shù)據(jù)庫設(shè)計(jì)),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Kafka日志清理實(shí)現(xiàn)詳細(xì)過程講解
這篇文章主要為大家介紹了Kafka日志清理實(shí)現(xiàn)詳細(xì)過程講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
在SpringBoot微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫的代碼示例
在現(xiàn)代微服務(wù)架構(gòu)中,通常需要與多個(gè)數(shù)據(jù)庫交互的服務(wù),這可能是由于各種原因,例如遺留系統(tǒng)集成、不同類型的數(shù)據(jù)存儲(chǔ)需求,或者僅僅是為了優(yōu)化性能,在本綜合指南中,我們將探討如何在 Spring Boot 微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫連接,需要的朋友可以參考下2024-12-12
java中JSONArray互相轉(zhuǎn)換List的實(shí)現(xiàn)
本文主要介紹了java中JSONArray互相轉(zhuǎn)換List的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

