Java面试常常问到Mybatis一级缓存和二级缓存,明天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别@mikechen
Mybatis缓存
缓存就是内存中的数据,经常来自对数据库查问后果的保留,应用缓存能够防止频繁与数据库进行交互,从而进步查问响应速度。
MyBatis 提供了对缓存的反对,分为一级缓存和二级缓存,如下图所示:
咱们先大抵理解下MyBatis一级缓存与MyBatis 二级缓存:
一级缓存:SqlSession级别的缓存,缓存的数据只在SqlSession内无效。
二级缓存:mapper级别的缓存,同一个namespace专用这一个缓存,所以对SqlSession是共享的,二级缓存须要咱们手动开启。
上面咱们再别离详解两者的原理与区别。
\
Mybatis一级缓存
1.为什么须要Mybatis一级缓存
当咱们应用Mybatis进行数据库的操作时候,会创立一个SqlSession来进行一次数据库的会话,会话完结则敞开SqlSession对象。
如果咱们很有可能屡次查问完全相同的sql语句,每一次查问都查问一次数据库,那查询数据库代价是比拟大的,这会导致系统的资源节约。
为了解决这个问题,Mybatis对每一次会话都增加了缓存操作,不必雷同的SQL每次都须要查询数据库,这就是Mybatis一级缓存的作用。
\
2.Mybatis一级缓存的实现
咱们晓得对SqlSession的操作,mybatis外部都是通过Executor来执行的,Executor的生命周期和SqlSession是统一的。
Mybatis在Executor中创立了本地缓存(一级缓存),如下图所示:
大抵的流程如下:
第一次查问用户id信息,先去缓存中查问是否有,如果没有,从数据库中查问用户信息,失去用户信息后在将用户信息贮存到一级缓存中。
如果sqlSession去执行commit操作(插入、更新、删除),清空sqlSession中的一级缓存,保障缓存中始终保留的是最新的信息,防止脏读。
第二次查问用户id信息,先去缓存中查问,如缓存中有,间接从缓存中获取。
留神:两次查问须在同一个sqlsession中实现,否则将不会走mybatis的一级缓存。
在mybatis与spring进行整合开发时,事务管制在service中进行,反复调用两次servcie将不会走一级缓存,因为在第二次调用时session办法完结,SqlSession就敞开了。
\
3.Mybatis一级缓存配置
mybatis一级缓存的范畴有SESSION和STATEMENT两种,默认是SESSION。
如果不想应用一级缓存,能够把一级缓存的范畴指定为STATEMENT,这样每次执行完一个Mapper中的语句后都会将一级缓存革除。
如果须要更改一级缓存的范畴,能够在Mybatis的配置文件中,在下通过localCacheScope指定。
<setting name="localCacheScope" value="STATEMENT"/>
\
Mybatis二级缓存
1.为什么须要Mybatis二级缓存?
MyBatis 一级缓存最大的共享范畴就是一个SqlSession外部,那么如果多个 SqlSession 须要共享缓存,则须要开启二级缓存。
\
2.Mybatis二级缓存的实现
开启二级缓存后,会应用 CachingExecutor 装璜 Executor,进入一级缓存的查问流程前,先在 CachingExecutor 进行二级缓存的查问,具体的工作流程如下所示。
二级缓存开启后,同一个 namespace 下的所有操作语句,都影响着同一个 Cache,即二级缓存被多个 SqlSession 共享,是一个全局的变量。
当开启缓存后,数据的查问执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
MyBatis 是默认敞开二级缓存的,因为对于增删改操作频繁的话,那么二级缓存形同虚设,每次都会被清空缓存。
\
Mybatis一级缓存与二级缓存的区别
1)一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Myabits默认开启一级缓存。
在同一个SqlSession中,执行雷同的SQL查问时;第一次会去查询数据库,并写在缓存中,第二次会间接从缓存中取。 当执行SQL时候两次查问两头产生了增删改的操作,则SQLSession的缓存会被清空。
每次查问会先去缓存中找,如果找不到,再去数据库查问,而后把后果写到缓存中。 Mybatis的外部缓存应用一个HashMap,key为hashcode+statementId+sql语句。Value为查问进去的后果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。
2) Mybatis二级缓存是默认不开启的,作用于一个Application,是Mapper级别的,多个SqlSession应用同一个Mapper的sql可能应用二级缓存。
以上
作者简介
陈睿|mikechen,10年+大厂架构教训,《BAT架构技术500期》系列文章作者,分享十余年架构教训以及面试心得!
浏览mikechen的互联网架构更多技术文章合集
Java并发|JVM|MySQL|Spring|Redis|分布式|高并发|架构师
关注「mikechen 的互联网架构」公众号,回复 【架构】 支付我原创的《300 期 + BAT 架构技术系列与 1000 + 大厂面试题答案》