mybatis基础流程_Mybatis的缓存

mybatis基础流程_Mybatis的缓存

mybatis提供了缓存机制, 分为一级缓存和二级缓存,其中一级缓存默认开启,二级缓存默认关闭

 1.  先聊一下一级缓存. ,默认此时一级缓存是开启的,二级缓存是关闭的

    结论: 一级缓存作用于每次SqlSession,因为每次与数据库的交互都会创建一个SqlSession,也就是说Mybatis的一级缓存只存在于每次会话中(感觉比较鸡肋的一个东西).

    通过之前的文章,已经了解到mybatis提供给了我们顶级API对象 SqlSession来操作数据库,但是其实内部真正负责执行的是Executor.

 

 a . 之前说过,当我们未选择执行器类型,生成默认的SqlSession(DefaultSqlSession)时候,会采用SimpleExecutor. 那我们现在来看一下SimpleExecutor

 a . 首先看到SimpleExecutor继承了BaseExecutor , 接下来我们点进去看BaseExecutor.

 b . doSelect 和 doUpdate()方法,里面都创建了Statement对象, 确实也说明每次查询或者更新都会创建新的Statement. 这里与与MapperStatement不同,MapperStatement是每一个sql语句的标签会生成一个MapperStatement对象.

 a . localCache 的成员变量,我们已经可以大致猜出来它就是一级缓存(本地缓存)

 b . 点进去发现,其实就是一个final类型的Map. key 和  value 都为object. 所以equals()和hashCode()方法都被重写了.

 a .通过查看put方法,知道key存放的是CacheKey对象. CacheKey的对象创建.大概会用到sql语句, sql语句的id. limit , paramter(用户的传参) ,offset

a . 截止到此,就已经看到了mybatis的真面目. 当开启的时候,如果命中了,就取出来,但是如果取出为空,也会再次查询数据库.并再次将结果放入到Map内

b . 因为缓存范围太小, 多个sqlSession同时进行,如果一个SqlSession删除或者新增,可能会造成脏数据.

 2.  二级缓存

      

 结论:二级缓存作用于namespace中(可以作用于多个SqlSessionle了),我们一般都是一张表都存在一个配置Mapper.xml, 因为多表联查的时候,可能会导致某个缓存未清,造成脏数据.使用条件也比较苛刻.

  1. 在MyBatis的配置文件中开启二级缓存。<setting name="cacheEnabled" value="true"/>

  2. 在MyBatis的映射XML中配置cache或者 cache-ref 。

    cache标签用于声明这个namespace使用二级缓存,并且可以自定义配置。<cache/>

a . 其实在创建SqlSession的时候,我们就已经知道二级缓存是用CachingExecutor来处理的(装饰者模式)

b . 用户执行查询,如果二级缓存打开,默认会先进入CachingExecutor,如果未命中才会继续委派SimpleExecutor来执行查询(截止到这,就与不打开二级缓存一样了.)

 

 

a . 根据代码,大概知道TransactionCacheManage大概与缓存有关了.

a . 这里其实缓存其实也是一个Map . 依然是CacheKey. 但是这里还有commit()方法.

如果二级缓存想要命中实现,commit之后才能生效,不然将不会命中,原因:
如果不调用commit方法的话,由于TranscationalCache的作用,并不会对二级缓存造成直接的影响 . 原因是因为mybatis的缓存会被一个transactioncache类包装住,所有的cache.putObject全部都会被暂时存到一个map里,等事务提交以后,这个map里的缓存对象才会被真正的cache类执行putObject操作。

这么设计的原因是为了防止事务执行过程中出异常导致回滚,如果get到object后直接put进缓存,万一发生回滚,就很容易导致mybatis缓存被脏读


作者:wuxinliulei
链接:https://www.zhihu.com/question/40718470/answer/87915129
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

b . 在二级缓存执行流程后就会进入一级缓存的执行流程,因此不再赘述

c . 总体上说 不需要使用Mybatis的缓存,都很鸡肋

            

        

猜你喜欢

转载自www.cnblogs.com/liweibing/p/12750834.html
今日推荐