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

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

本机环境优化前耗时:

储位个数
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()不会提交事务。

源码解析

核心代码 

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 2024-01-24 17:31  zhengbiyu  阅读(41)  评论(0)    收藏  举报