关于Mybatis的Batch模式性能测试及结论 柔光的暖阳◎ 2021-06-24 14:35 457阅读 0赞 近日在公司项目中,使用到spring+mybatis的架构,特对mybatis的batch模式做了相关研究,得出以下结论: 1.Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句, 并且批量执行所有更新语句,显然batch性能将更优; 2.但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,;此外,对于update、delete无法返回更新、插入条数。这在某型情形下是不符合业务要求的 3. 在测试中使用simple模式提交10000条数据,时间为18248 毫秒,batch模式为5023 ,性能提高70%; 4.通过走码和研读spring相关文件发现,在同一事务中batch模式和simple模式之间无法转换,由于本项目一开始选择了simple模式,所以碰到需要批量更新时,只能在单独的事务中进行; 5.在代码中使用batch模式可以使用以下方式: //从spring注入原有的sqlSessionTemplate @Autowired private SqlSessionTemplate sqlSessionTemplate; public void testInsertBatchByTrue() \{ //新获取一个模式为BATCH,自动提交为false的session //如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出 SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession( ExecutorType.BATCH, false); //通过新的session获取mapper fooMapper = session.getMapper(FooMapper.class); int size = 10000; try \{ for (int i = 0; i < size; i++) \{ Foo foo = new Foo(); foo.setName(String.valueOf(System.currentTimeMillis())); fooMapper.insert(foo); if (i % 1000 == 0 || i == size - 1) \{ //手动每1000个一提交,提交后无法回滚 session.commit(); //清理缓存,防止溢出 session.clearCache(); \} \} \} catch (Exception e) \{ //没有提交的数据可以回滚 session.rollback(); \} finally \{ session.close(); \} \} 6.上述代码没有使用spring的事务,改动手动控制,如果和原spring事务一起使用,将无法回滚,必须注意,最好单独使用;
还没有评论,来说两句吧...