- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解决mybatis-plus 查询耗时慢的问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
查出30000多条id 。
然后用 。
1
2
|
EntityWrapper ew =
new
EntityWrapper<>();
ew.in(TableFieldConstant.F_AUTH_RESULT_ID, ids);
|
查询会很慢 。
跟了一下mybatis-plus源码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
;
}
}
|
问题出现在 。
1
|
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秒多 。
把使用mybaits 批量查询改为 手写sql查询 之后问题解决 。
使用mybatis-plus批量操作时要谨慎 能写sql尽量写sql 。
这个跟mybatis-plus 的小伙伴提了问题后已经解决 可以升级jar版本 3.x 。
我发现不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,实际上在插入的时候仍然是一条条记录的插,速度远不如原来Mybatis的foreach拼接SQL的方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
// 第一步判断更新或添加
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、就是这样的一种情景也很符合大部分的开发场景,可就是1000条数据的情况下用了8秒 ,这可能与计算机的性能有很大的关系,但就是如此也不至于用八秒钟,那么用户体验会很惨的.
2、JDBC连接URL字符串中需要新增一个参数:
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参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入.
4、MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能.
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL 。
另外这个选项对INSERT/UPDATE/DELETE都有效 。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/cuixinzhou/article/details/113030993 。
最后此篇关于解决mybatis-plus 查询耗时慢的问题的文章就讲到这里了,如果你想了解更多关于解决mybatis-plus 查询耗时慢的问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在我的 UIPath 项目中实现了一个普通的“for each”循环(不是每行特定的 excel)。 for-each 循环使用以前从 excel 文件中检索到的数据查看数据表。 然后,for-ea
我认为我的 SQL 查询花费的时间太长,现在看起来大约需要 30 秒。我有两个表,Record 和 Mainrecord。我想获取有关列金额中包含 0 的所有 Mainrecords 的信息,并且在这
这个编辑器是水平的http://tinymce.moxiecode.com/examples/simple.php我似乎只找到水平编辑器,有人遇到过垂直编辑器吗?有什么例子吗? build 需要多长时
我想创建一个跟踪任务时间的 ASP.NET WinForms 应用程序。我需要能够编写表单,以便将任务添加到数据库、在新选项卡中打开它,以及能够开始、暂停和停止任务。完成后,我需要计算完成任务所需的时
抱歉,我是 C 的新手。但我做错了什么?几乎尝试了一切,但仍然无法计算执行 t1 和 t2 之间的代码所传递的秒数,总是返回我在 0.00 秒内完成。感谢您的耐心等待:) #include cloc
我有 2 个简单的函数(在一个范围内循环)可以单独运行而没有任何依赖性。我正在尝试使用 Python 多处理模块和多线程模块来运行这 2 个函数。 当我比较输出时,我看到多进程应用程序比多线程模块多花
尝试记录使用装饰器运行函数所需的时间,但我误解了一些东西。它拒绝写登录装饰器。 当你颠倒装饰器的顺序时,它会导致模板上的构建错误(就像信息丢失一样)。 在我的初始 py 中: if app.debug
我听说 System.out.println(); Java 语句是昂贵的(它消耗了很多时间) 所以我试着评估一下它的成本: 当我评估 5 个语句时...成本 = 1.0 所以我预计 1 条语句的成本
我正在使用 codeigniter REST-API(作者:philsturgeon 引用 URL: https://github.com/philsturgeon/codeigniter-rests
我在 SFML 中有一个时钟和计时器,它测量秒数。我试图在经过一定秒数(特别是 4 秒)后执行下一个操作 这是我的代码 #include "stdafx.h" #include "Splash
例如,我们在 SomeActivity 中,该 Activity 有一个按钮,用于调用将文件从一个目录移动到另一个目录(我们称之为作业)。 在黑莓手机上我会: 推送一个不可取消的弹出窗口(对话框屏幕)
我正在尝试从大小为 7,140,000 的 ArrayList 中删除 140,000 个对象。我预计这会花费几秒钟(如果那样的话),但 Java 每千个对象花费几秒钟。这是我的代码:
我得到了这个查询,它占用了我的 elapsed_time 并且工作正常,但后来我意识到我得到的 actual_elapsed 的值是错误的。 actual_elapsed 是我使用 TIMEDIFF(
我在更新面板中放置了一个 GridView。 当用户按下按钮时,gridView 将被一个数据表填满: GridView_Overview.Da
客户想要将数据库从 MS SQL 转换为 MySql。 就我个人而言,我不会这样做,我更喜欢使用 MS SQL 来处理大型数据库,并且喜欢使用 MSSQL 时可用的工具。 但是我确实在较小的项目上使用
我目前正在为一个 Julia 项目使用 Graph Database,使用 Redis。 有时 Redis 请求需要 300 毫秒才能执行,我不明白为什么。我运行了一个简单的请求 10.000 次(请
我们在一次运行中处理了 500 万个请求。然而,在运行期间,很少有请求失败。验证关闭后,我们了解到 Full GC 已启动,并且花费了超过 40 秒(到 60 秒),从而导致超时。 配置:我们有 3
我是一名优秀的程序员,十分优秀!