Mybatis 一级缓存和二级缓存原理区别 (图文详解)(mybatis一级缓存和二级缓存的区别)

  本篇文章为你整理了Mybatis 一级缓存和二级缓存原理区别 (图文详解)(mybatis一级缓存和二级缓存的区别)的详细内容,包含有mybaties一级缓存和二级缓存 mybatis一级缓存和二级缓存的区别 mybatis一级缓存和二级缓存优缺点 mybatis一级缓存和二级缓存作用 Mybatis 一级缓存和二级缓存原理区别 (图文详解),希望能帮助你了解 Mybatis 一级缓存和二级缓存原理区别 (图文详解)。

  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并发JVMMySQLSpringRedis分布式高并发架构师

  以上就是Mybatis 一级缓存和二级缓存原理区别 (图文详解)(mybatis一级缓存和二级缓存的区别)的详细内容,想要了解更多 Mybatis 一级缓存和二级缓存原理区别 (图文详解)的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: