🌸 批量插入使用注意点 🌸
🌸 一、mysql连接
-
jdbc url 加上
-
&rewriteBatchedStatements=true
-
🌸 二、注意使用
-
推荐
使用
mapper
的
dbSaveBatch
,性能强劲,默认1000一个批次,可修改单次提交条数,严禁超过5000- 10000条 5000条一批次,测试插入0.559秒
- 10000条 2000条一批次,测试插入0.770秒
/**
* 批量测试
*
* @return void
* @author 陈賝
* @date 2023/6/1 10:32
*/
@Test
public void test08() {
List<Device> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
Device device = new Device();
device.setType(2L + i);
list.add(device);
}
long l = System.currentTimeMillis();
System.out.println(deviceMapper.dbSaveBatch(list,5000));
System.out.println(System.currentTimeMillis() - l + " ms");
System.out.printf("");
}
-
5000条一批次
-
2000条一批次
-
尽量
不用
service
的
savebatch
,性能一般,默认1000一个批次,可使用但不推荐- 10000条测试插入1.479秒
/**
* 批量测试
*
* @return void
* @author 陈賝
* @date 2023/6/1 10:32
*/
@Test
public void test08() {
List<Device> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
Device device = new Device();
device.setType(2L + i);
list.add(device);
}
long l = System.currentTimeMillis();
deviceService.saveBatch(list);
System.out.println(System.currentTimeMillis() - l + " ms");
System.out.printf("");
}
🌸 三、Mapper层代码
public interface ProMapper<T extends BaseEntity> extends MPJBaseMapper<T> {
/**
* 批量插入(高性能,适合大量插入)
* 大幅提升批量插入性能,但注意考虑性能问题(批次增大到一定数量时,CPU上升将出现瓶颈)
*
* @param entityList 实体
* @return boolean
* @author 陈賝
* @date 2023/6/1 10:46
*/
default boolean dbSaveBatch(Collection<T> entityList) {
return Db.saveBatch(entityList);
}
/**
* 批量插入(高性能,适合大量插入)
* 大幅提升批量插入性能,但注意考虑性能问题(批次增大到一定数量时,CPU上升将出现瓶颈)
*
* @param entityList 实体
* @param batchSize 单批次提交条数(非常不建议超过 5000)
* @return boolean
* @author 陈賝
* @date 2023/6/1 11:25
*/
default boolean dbSaveBatch(Collection<T> entityList, int batchSize) {
return batchSize <= 5000 && Db.saveBatch(entityList, batchSize);
}
}
版权声明:本文为Chen_chenjiasheng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。