1.现象
查出30000多条id
然后用
EntityWrapper ew = new EntityWrapper<>();
ew.in(TableFieldConstant.F_AUTH_RESULT_ID, ids);
查询会很慢
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;
}
}
问题出现在
sqlStr = sqlStr.replace(String.format("{%s}", i), String.format("#{%s.paramNameValuePairs.%s}", this.getParamAlias(), genParamName));
对replace 测试 发现当数据量大时替换会很耗时 测试的遍历了30000次拼接从1到30000 替换耗时20多秒
对 apache-commons-lang 的StringUtis.replace测试是耗时7秒多
3总结
把使用mybaits 批量查询改为 手写sql查询 之后问题解决
使用mybatis-plus批量操作时要谨慎 能写sql尽量写sql
这个跟mybatis-plus 的小伙伴提了问题后已经解决 可以升级jar版本 3.x