MyBatis缓存机制详解(非常详细)

MyBatis缓存机制详解(非常详细)-mikechen

MyBatis缓存

缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存可以避免频繁与数据库进行交互,从而提高查询响应速度。

MyBatis 提供了对缓存的支持,分为一级缓存和二级缓存,如下图所示:

MyBatis缓存机制详解(非常详细)-mikechen

 

MyBatis一级缓存

MyBatis一级缓存是MyBatis提供的一种缓存机制,即在同一会话中MyBatis会自动将第一次查询的结果集缓存,后续的同一查询不再调用数据库查询,大大提升了效率。

MyBatis一级缓存是session级别的缓存,生命周期是一次会话,session关闭一级缓存就失效了。

MyBatis缓存机制详解(非常详细)-mikechen

备注:如果二级缓存开启时,会先走二级缓存。

我们知道对SqlSession的操作,MyBatis内部都是通过Executor来执行的,Executor的生命周期和SqlSession是一致的。

MyBatis在Executor中创建了本地缓存(一级缓存),如下图所示:

MyBatis缓存机制详解(非常详细)-mikechen

大致的流程如下:

第一次查询用户id信息,先去缓存中查询是否有,如果没有,从数据库中查询用户信息,得到用户信息后在将用户信息储存到一级缓存中。

如果sqlSession去执行commit操作(插入、更新、删除),清空sqlSession中的一级缓存,保证缓存中始终保存的是最新的信息,避免脏读。

第二次查询用户id信息,先去缓存中查询,如缓存中有,直接从缓存中获取。

注意:两次查询须在同一个sqlsession中完成,否则将不会走MyBatis的一级缓存。

在MyBatis与spring进行整合开发时,事务控制在service中进行,重复调用两次servcie将不会走一级缓存,因为在第二次调用时session方法结束,SqlSession就关闭了

一级缓存是默认开启的,不需要任何配置,也不可关闭。

 

MyBatis二级缓存

二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的,二级缓存需要我们手动开启。

开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在 CachingExecutor 进行二级缓存的查询,具体的工作流程如下所示。

MyBatis缓存机制详解(非常详细)-mikechen

二级缓存开启后,同一个 namespace 下的所有操作语句,都影响着同一个 Cache,即二级缓存被多个 SqlSession 共享,是一个全局的变量。

当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

MyBatis 是默认关闭二级缓存的,因为对于增删改操作频繁的话,那么二级缓存形同虚设,每次都会被清空缓存。

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法