springboot 集成的 mybatis 设置 executorType 为 batch模式

springboot 集成的 mybatis 设置 executorType 为 batch模式

三种执行器

mybatis提供三种sql执行器,分别是SIMPLE(默认)、REUSE、BATCH。

  • SIMPLE(SimpleExecutor),相当于JDBC的stmt.execute(sql) 执行完毕即关闭即 stmt.close()

  • REUSE(ReuseExecutor),相当于JDBC的stmt.execute(sql) 执行完不关闭,而是将stmt存入 Map<String, Statement>中缓存,其中key为执行的sql模板;

  • BATCH(BatchExecutor),相当于JDBC语句的 stmt.addBatch(sql),即仅将执行SQL加入到批量计划但是不真正执行, 所以此时不会执行返回受影响的行数,而只有执行stmt.execteBatch()后才会真正执行sql

三种方式各有利弊

方式优势劣势
SIMPLE默认执行器, 节约服务器资源每次都要开关Statement
REUSE提升后端接口处理效率每次一个新sql都缓存,增大JVM内存压力
BATCH专门用于更新插入操作,效率最快对select 不适用,另外特殊要求,比如限制一次execteBatch的数量时需要写过滤器定制

设置为batch模式

springboot 下开启 batch模式比较简单,

全局方式开通batch

在yml文件中添加 如下配置即可。

mybatis:
  executor-type: batch

原因是mybatis-spring-boot源码,this.properties 就是读取了yml中的内容:

@Bean
    @ConditionalOnMissingBean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        ExecutorType executorType = this.properties.getExecutorType();
        if (executorType != null) {
            return new SqlSessionTemplate(sqlSessionFactory, executorType);
        } else {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }

方法中直接指定batch

这个方式的缺陷就是事务方面不受spring管理了。

    @Autowired
    protected SqlSessionFactory sqlSessionFactory;
    
    public void saveOrder(Order t) {
		SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		
		try{
			orderMapper.save(t);
			sqlSession.commit();
		}catch(Exception e){
			logger.error("批量导入数据异常,事务回滚", e);
			sqlSession.rollback();
		}finally {
			if (sqlSession != null) {
		  		sqlSession.close();
			}
	}
}

后记

如果单纯的数据同步,其实可以建议 原生JDBC !,当然可以采用封装的JDBC工具类,真心快的一笔!

    // 从spring管理的数据源中直接拿
    @Resource(name = "dataSource")
    private DataSource dataSource;
    
    @Test
    public void jdbcTest() throws SQLException {
        Connection connection = dataSource.getConnection();
        connection.setAutoCommit(false);
        String sql = "INSERT INTO tpm_user (id,name,createDate,remark) VALUES(?,?,?,?) ";

        PreparedStatement statement = connection.prepareStatement(sql);
        for (int i = 0; i < 1000000; i++) {
            statement.setLong(1, snowflakeService.nextId());
            statement.setString(2, "name" + i);
            statement.setDate(3, new Date(System.currentTimeMillis()));
            statement.setString(4, "remark" + i);
            statement.addBatch();
        }
        long start = System.currentTimeMillis();
        statement.executeBatch();
        connection.commit();
        
        statement.close();
        connection.close();
        System.out.print("耗时:");
        System.out.println(System.currentTimeMillis() - start);
    }

MyBatis 的 `ExecutorType` 是用来指定 SQL 执行器类型的一个枚举,它定义了 MyBatis 执行 SQL 语句时的操作模式。默认情况下,MyBatis 使用的是 `ExecutorType.SIMPLE` 类型,它适用于大多数情况。但是,当你需要处理大量数据或者需要进行批处理操作时,可以使用 `ExecutorType.REUSE` 或 `ExecutorType.BATCH`。 下面是使用 `ExecutorType.BATCH` 进行批处理操作的一个简单示例: ```java // 获取 SqlSessionFactory SqlSessionFactory sqlSessionFactory = // 初始化代码获取 SqlSessionFactory // 获取 SqlSession try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) { // 获取 Mapper SomeMapper mapper = session.getMapper(SomeMapper.class); // 创建一个 List 集合,用于存储参数 List<SomeEntity> entityList = new ArrayList<>(); for (int i = 0; i < 100; i++) { // 创建实体对象并添加到集合中 SomeEntity entity = new SomeEntity(); // 设置实体属性 entity.setProperty1("value1"); entity.setProperty2("value2"); // ... 其他属性设置 entityList.add(entity); } // 执行批量插入操作 mapper.insertBatch(entityList); // 提交事务 session.commit(); } ``` 在上面的示例中,首先通过 `SqlSessionFactory.openSession(ExecutorType.BATCH)` 创建了一个 `SqlSession` 对象,并指定了执行器类型为 `ExecutorType.BATCH`。这样做是为了让 MyBatis 使用批处理方式执行 SQL 语句,从而提高大量数据插入时的性能。随后,通过获取的 `Mapper` 对象执行了一个 `insertBatch` 方法,该方法假设已经在 Mapper XML 文件中定义好了。最后,不要忘记提交事务,以确保所有的更改都被保存到数据库中。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值