随笔 - 171  文章 - 0  评论 - 0  阅读 - 62217

大数据量插入、更新改成批量模式

可以看出实际应用场景中储位数据量比较大,优先优化储位相关接口

本机环境优化前耗时:

储位个数
3200
update时间 28578
insert时间 21758

 

本机环境优化后耗时:

储位个数
3200
update时间 5169
insert时间 1733

 

将数据库连接加上rewriteBatchedStatements=true,因为mysql的驱动包里有代码限制

数据源:org.apache.commons.dbcp.BasicDataSource

依赖版本:commons-dbcp:1.4

数据源属性defaultAutoCommit=false;否则sqlSession.commit()不会提交事务。

源码解析

核心代码 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
boolean isSuccess = true;
SqlSession sqlSession = null;
try {
    sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
    sqlSession.getConnection().setAutoCommit(false);
    WCellDao wCellDaoBatch = sqlSession.getMapper(WCellDao.class);
    WShelfDao wShelfDaoBatch = sqlSession.getMapper(WShelfDao.class);
    if (CollectionUtils.isNotEmpty(cellExistNeedUpdateList)) {
        for (Cell cel : cellExistNeedUpdateList) {
       wCellDaoBatch.updateCell(cel);
     }
    }
 
} catch (Exception e) {
    isSuccess = false;
    sqlSession.rollback();
    throw e;
} finally {
    if (sqlSession != null) {
        if (isSuccess) {
            sqlSession.commit();
        }
        sqlSession.close();
    }
}

为什么批量模式这么快?

分别抓包看看,

Test1:

REUSE模式下 代码循环单条执行(耗时最久):

 
第一次
第二次
第三次
分组数 6500 6506 6508
总大小(字节) 2107617 2187085 2187913

 

Test2:

REUSE模式下 Mybatis循环拼接sql执行:

 
第一次
第二次
第三次
分组数 1747 1657 1012
总大小(字节) 3478215 2544297 1999521

 

Test3:

BATCH模式下 代码循环单条执行(耗时最少):

 
第一次
第二次
第三次
分组数 1015 1315 1591
总大小(字节) 1860823 1929347 1941918

 

tips:BATCH模式下测试记得越过mysql驱动的限制。

posted on   zhengbiyu  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示