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 的批量插入性能。如果你有其他优化技巧,欢迎分享和讨论。