Mybatis-plus: 能否进一步提高批量保存更新的性能

Created on 24 Jul 2019  ·  1Comment  ·  Source: baomidou/mybatis-plus

当前使用版本(必须填写清楚,否则不予处理)

3.1.2

该问题是怎么引起的?(最新版上已修复的会直接close掉)

ServiceImpl#saveOrUpdateBatch(Collection entityList)方法, 是在循环entityList的过程中, 针对每一条数据, 调用一下getById查询本条数据是否已经存在, 如果批量数据比较大, 比如成百上千条, 这里就会产生成百上千次查询, 在对性能要求比较高时影响会比较大.
建议能否按如下两种方法来处理:

  1. 可将getById调整为existsById(Object id), 这样在表字段比较多时, 就不用将所有字段都查出来了, 只要判断是否存在就行了
  2. 可在循环外调用existsByIds(Collection ids)将所有已经存在的数据的id查询到set中, 后面循环中, 看下set里是否存在就好了, 这样只用查询一次

这里额外提个问题:
baseMapper里可否增加boolean existsById(Object id)和Set existsByIds(Collection ids)这两个方法, 这个用的应该还是比较多的

再有:
以上问题, 如果你们没时间搞, 我自己提PR是否可以?

重现步骤

报错信息

Most helpful comment

插入校验最好在插入之前批量查询一次,不要查询多次,这个你代码运行步骤上应该避免此问题。

我们现有方法已经提供了功能较多的查询方式,你可以使用 java8 默认方法的形式实现你想要新增的功能。比如:自定义一个接口继承 mp 的 BaseMapper,

`
interface YourMapper extends BaseMapper{

default boolean existsById(Object id){
    // 将条件构建为 Wrapper 省略
    return 0 != selectCount(wrapper);
}

}
`
相比注入一个新的方法,默认方法可以有效减少 mybatis 的 configuration 中 MapperedStatement 的数量,减少内存占用。

有好的建议或者想法欢迎 PR!

>All comments

插入校验最好在插入之前批量查询一次,不要查询多次,这个你代码运行步骤上应该避免此问题。

我们现有方法已经提供了功能较多的查询方式,你可以使用 java8 默认方法的形式实现你想要新增的功能。比如:自定义一个接口继承 mp 的 BaseMapper,

`
interface YourMapper extends BaseMapper{

default boolean existsById(Object id){
    // 将条件构建为 Wrapper 省略
    return 0 != selectCount(wrapper);
}

}
`
相比注入一个新的方法,默认方法可以有效减少 mybatis 的 configuration 中 MapperedStatement 的数量,减少内存占用。

有好的建议或者想法欢迎 PR!

Was this page helpful?
0 / 5 - 0 ratings