玉山建设局网站,流量推广app,南昌seo推广,大连网络推广公司哪家好实战总结
1.批量插入性能
1.批量插入性能差的原因
使用saveBatch()方法时#xff0c; MySQL JDBC驱动在默认情况下会无视executeBatch()语句#xff0c;把我们期望批量执行的一组sql语句拆散#xff0c;一条一条地发给MySQL数据库#xff0c;批量插入实际上是单条插入 MySQL JDBC驱动在默认情况下会无视executeBatch()语句把我们期望批量执行的一组sql语句拆散一条一条地发给MySQL数据库批量插入实际上是单条插入直接造成较低的性能。
查看对应源码 public static E boolean executeBatch(Class? entityClass, Log log, CollectionE list, int batchSize, BiConsumerSqlSession, E consumer) {Assert.isFalse(batchSize 1, batchSize must not be less than one, new Object[0]);return !CollectionUtils.isEmpty(list) executeBatch(entityClass, log, (sqlSession) - {int size list.size();int i 1;for(Iterator var6 list.iterator(); var6.hasNext(); i) {E element var6.next();consumer.accept(sqlSession, element);if (i % batchSize 0 || i size) {sqlSession.flushStatements();}}});}最终来到了executeBatch()方法可以看到这很明显是在一条一条循环插入通过sqlSession.flushStatements()将一个个单条插入的insert语句分批次进行提交而且是同一个sqlSession这相比遍历集合循环insert来说有一定的性能提升但是这并不是sql层面真正的批量插入。
2.解决批量插入性能差方案
通过查阅相关文档后发现mybatisPlus提供了sql注入器我们可以自定义方法来满足业务的实际开发需求。 在扩展包下mybatisPlus还为我们提供了可扩展的可注入方法
AlwaysUpdateSomeColumnById 根据Id更新每一个字段全量更新不忽略null字段解决mybatis-plus中updateById默认会自动忽略实体中null值字段不去更新的问题 InsertBatchSomeColumn 真实批量插入通过单SQL的insert语句实现批量插入 Upsert 更新or插入根据唯一约束判断是执行更新还是删除相当于提供insert on duplicate key update支持。 那么现在开始解决批量插入性能差的问题
1.创建自定义sql注入器并继承DefaultSqlInjector
/*** author zhmsky* date 2022/8/15 15:13*/
public class MySqlInjector extends DefaultSqlInjector {Overridepublic ListAbstractMethod getMethodList(Class? mapperClass) {ListAbstractMethod methodList super.getMethodList(mapperClass);//更新时自动填充的字段不用插入值methodList.add(new InsertBatchSomeColumn(i - i.getFieldFill() ! FieldFill.UPDATE));return methodList;}
}2.将自定义的sql注入器注入到Mybatis容器中
/*** author zhmsky* date 2022/8/15 15:15*/
Configuration
public class MybatisPlusConfig {Beanpublic MySqlInjector sqlInjector() {return new MySqlInjector();}
}3.业务开始使用
使用可以继承 BaseMapper 添加自定义方法
/*** author zhmsky* date 2022/8/15 15:17*/
public interface CommonMapperT extends BaseMapperT {/*** 真正的批量插入* param entityList* return*/int insertBatchSomeColumn(ListT entityList);
}或者直接在业务中使用
public interface CpChickSupplyChainFlockProPreDMapper extends BaseMapperCpChickSupplyChainFlockProPreD {/*** 执行 executeBatch()语句实现真正的批量插入* param entityList* return*/int insertBatchSomeColumn(CollectionCpChickSupplyChainFlockProPreD entityList);
}
执行后日志输出 mybatisPlus批量插入性能优化_mybatisplus高效批量_zhm_sky的博客-CSDN博客 2.批量删除性能
和批量插入的原因一样使用mybatisPlus的IService.removeBatchByIds默认的方法最后也是一条一条去执行的性能比较差。
所以在执行批量删除时不要使用IService的默认方法应该使用BaseMapper.deleteBatchIds方法它才是真正的执行了批量操作。
执行日志如下
08:49:12.538 [http-nio-9502-exec-2] DEBUG c.c.p.m.C.deleteBatchIds - [debug,137] - Preparing: DELETE FROM cp_chick_supply_chain_flock_pro_pre_d WHERE id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? )