Mybatis中三种ExecutorType方式
ExecutorType是一个枚举类,提供了三种执行模式,分别为:
- SIMPLE:字面意思为基本的,简单的,简易的
- REUSE:字面意思为可重用的
- BATCH:字面意思为批量处理的
其实从字面意思来看,多多少少还是能猜测到其各自的功能,其中默认值为SIMPLE。这三种模式分别对应三种执行器,分别为SimpleExecutor,ReuseExecutor,BatchExecutor。
SimpleExecutor中进行增删改的源码为:
1 |
|
从源码可知,SimpleExecutor这种方式每次都会创建一个statement,执行完毕后就关闭。也就是说,我在代码中遍历执行更新操作,每循环一次都是一次statement创建 — 执行 — 关闭操作。
ReuseExecutor中进行增删改的源码为:
1 | // 用于存储statement的map |
从源码可知,ReuseExecutor不会关闭statement,而是把statement放到map中,其中key为sql语句,value为对应的statemen。也就是说这种模式不会为每句sql创建一个statement,如果sql相同(其中的插入的数据可以不同)就会重复使用以前创建过的statement,节约了重复创建statement的时间,直接通过key去缓存中获取statemet.
BatchExecutor中进行增删改的源码为:
1 | // 这里就解释了为什么使用这种模式返回值是-2147482646 |
这里源码看的不是太懂,只看出了其每次执行更新操作都会返回一个固定值-2147482646,也就是上一篇不能用变量去接收其返回参数的原因。剩余不懂的部分,经查询百度可知,BatchExecutor在执行时会将statement加入到batchResultList中,然后在doFlushStatements方法中进行批量执行。
三种模式以及foreach的性能对比
这里来比较三种模式之间的性能,从上面分析大概可知,SIMPLE模式应该是性能最差的,foreach和REUSE性能可能相差不大,且高于SIMPLE,而BATCH模式应该是性能最好。
附上junit测试代码,第一个为三种模式的测试方式,第二个为foreach的测试方式:
1 |
|
先使用这三种模式循环插入2000条数据然后再使用foreach方式插入2000条,单位为毫秒值:
| SIMPLE | REUSE | BATCH | foreach |
|---|---|---|---|
| 2867 | 2497 | 798 | 900 |
多次测试数值如上,可能不太精确,但是大体结果还是很明显的,BATCH和foreach这两种方式性能都很好,我上面的猜测还是不太准确的,所以在开发中批量数据插入应该是首选这两种方式。
注意事项
由于REUSE和BATCH都需要在创建sqlSession的时候进行设置,所以如果项目中以前没有进行设置的话,需要重新生成一个sqlSession设置相应模式才能进行批量操作。