MyBatis缓存
缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存可以避免频繁与数据库进行交互,从而提高查询响应速度。
MyBatis 提供了对缓存的支持,分为一级缓存和二级缓存,如下图所示:
MyBatis一级缓存
MyBatis一级缓存是MyBatis提供的一种缓存机制,即在同一会话中MyBatis会自动将第一次查询的结果集缓存,后续的同一查询不再调用数据库查询,大大提升了效率。
MyBatis一级缓存是session级别的缓存,生命周期是一次会话,session关闭一级缓存就失效了。
备注:如果二级缓存开启时,会先走二级缓存。
我们知道对SqlSession的操作,MyBatis内部都是通过Executor来执行的,Executor的生命周期和SqlSession是一致的。
MyBatis在Executor中创建了本地缓存(一级缓存),如下图所示:
大致的流程如下:
第一次查询用户id信息,先去缓存中查询是否有,如果没有,从数据库中查询用户信息,得到用户信息后在将用户信息储存到一级缓存中。
如果sqlSession去执行commit操作(插入、更新、删除),清空sqlSession中的一级缓存,保证缓存中始终保存的是最新的信息,避免脏读。
第二次查询用户id信息,先去缓存中查询,如缓存中有,直接从缓存中获取。
注意:两次查询须在同一个sqlsession中完成,否则将不会走MyBatis的一级缓存。
在MyBatis与spring进行整合开发时,事务控制在service中进行,重复调用两次servcie将不会走一级缓存,因为在第二次调用时session方法结束,SqlSession就关闭了
一级缓存是默认开启的,不需要任何配置,也不可关闭。
MyBatis二级缓存
二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的,二级缓存需要我们手动开启。
开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在 CachingExecutor 进行二级缓存的查询,具体的工作流程如下所示。
二级缓存开启后,同一个 namespace 下的所有操作语句,都影响着同一个 Cache,即二级缓存被多个 SqlSession 共享,是一个全局的变量。
当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
MyBatis 是默认关闭二级缓存的,因为对于增删改操作频繁的话,那么二级缓存形同虚设,每次都会被清空缓存。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》