Mybatis Plus 批量插入性能优化

Mybatis Plus 批量插入性能优化

在软件开发中,Mybatis Plus 已经成为 Java 应用中广泛使用的 ORM 框架之一,它简化了数据库操作并提高了开发效率。然而,在处理大量数据插入时,性能问题可能成为瓶颈。本文将探讨如何优化 Mybatis Plus 的批量插入性能。

背景

在物联网平台的背景下,传感器的采集频率极高,导致数据库压力巨大。尽管分库分表可以减轻单表数据量,但批量插入效率的提升同样重要。

批量插入性能问题

默认情况下,Mybatis Plus 的 saveBatch() 方法并不是真正的批量插入。它实际上是在循环中逐条插入数据,这在大量数据插入时会导致性能问题。

解决方案

为了实现真正的批量插入,我们可以利用 Mybatis Plus 提供的 SQL 注入器。

1. 自定义 SQL 注入器

首先,继承 DefaultSqlInjector 类并重写 getMethodList 方法,添加 InsertBatchSomeColumn 方法。

public class MySqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
        return methodList;
    }
}

2. 注册自定义 SQL 注入器

接着,在 Spring 配置类中注册自定义的 SQL 注入器。

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MySqlInjector sqlInjector() {
        return new MySqlInjector();
    }
}

3. 自定义 Mapper 接口

然后,扩展 BaseMapper 接口,添加自定义的批量插入方法。

public interface CommonMapper<T> extends BaseMapper<T> {
    int insertBatchSomeColumn(List<T> entityList);
}

4. 使用自定义 Mapper 接口

让对应的 Mapper 接口继承自定义的 Mapper。

@Mapper
public interface UserMapper extends CommonMapper<User> {
}

5. 实现分批插入

最后,实现一个分批插入的方法,模仿 saveBatch 方法。

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public boolean saveBatch(Collection<User> entityList, int batchSize) {
        try {
            int size = entityList.size();
            int idxLimit = Math.min(batchSize, size);
            int i = 1;
            List<User> oneBatchList = new ArrayList<>();
            for (Iterator<User> var7 = entityList.iterator(); var7.hasNext(); i++) {
                User element = var7.next();
                oneBatchList.add(element);
                if (i == idxLimit) {
                    baseMapper.insertBatchSomeColumn(oneBatchList);
                    oneBatchList.clear();
                    idxLimit = Math.min(idxLimit + batchSize, size);
                }
            }
        } catch (Exception e) {
            log.error("saveBatch fail", e);
            return false;
        }
        return true;
    }
}

性能测试

通过对比测试,使用自定义的批量插入方法相比原生的 saveBatch() 方法,性能有显著提升。

总结

通过自定义 SQL 注入器和实现分批插入,我们可以有效提高 Mybatis Plus 的批量插入性能。这对于处理大量数据插入的场景非常有用。


希望本文能帮助你优化 Mybatis Plus 的批量插入性能。如果你有其他优化技巧,欢迎分享和讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真心喜欢你吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值