当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-02 10:18:33 Java

Java面试经常问Mybatis一级缓存和二级缓存。今天给大家详细讲解一下Mybatis一级缓存和二级缓存的原理和区别@mikechenMybatis缓存缓存就是内存中的数据,往往来自于数据库查询结果的存储,使用缓存可以避免频繁的交互与数据库,从而提高查询响应速度。MyBatis提供了对缓存的支持,分为一级缓存和二级缓存,如下图所示:我们先来大致了解一下MyBatis一级缓存和MyBatis二级缓存:一级缓存:SqlSession级缓存,缓存的数据只在SqlSession内有效。二级缓存:mapper级缓存,同一个命名空间共享这个缓存,所以是和SqlSession共享的,需要手动开启二级缓存。接下来,我们将详细解释两者的原理和区别。\Mybatis一级缓存1.Mybatis为什么需要一级缓存?当我们使用Mybatis进行数据库操作时,会为一次数据库会话创建一个SqlSession,当会话结束时SqlSession对象会被关闭。如果我们很可能多次查询完全相同的sql语句,每次查询一次数据库,那么查询数据库的成本会比较高,会导致系统资源的浪费。Mybatis为了解决这个问题,给每个session增加了缓存操作,不需要每次都用同样的SQL去查询数据库。这就是Mybatis一级缓存的作用。\2。Mybatis一级缓存的实现我们知道SqlSession的操作,mybatis内部是通过Executor执行的,Executor的生命周期与SqlSession是一致的。Mybatis在Executor中创建了一个本地缓存(一级缓存),如下图:大致流程如下:先查询用户id信息,先去缓存中查看是否有,如果没有,再查询用户从数据库中获取用户信息,获取用户信息后,将用户信息存储在一级缓存中。如果sqlSession执行了commit操作(insert、update、delete),清除sqlSession中的一级缓存,保证缓存中一直保存着最新的信息,避免脏读。第二次查询用户id信息,先去缓存中查询,如果缓存中有,直接从缓存中获取。注意:两次查询必须在同一个sqlsession中完成,否则不会使用mybatis的一级缓存。mybatis和spring集成开发时,在服务中进行事务控制。重复调用两次servcie是不会去一级缓存的,因为第二次调用时session方法结束,SqlSession关闭。\3。Mybatis一级缓存配置Mybatis一级缓存的范围为SESSION和STATEMENT,默认为SESSION。如果不想使用一级缓存,可以将一级缓存的作用域指定为STATEMENT,这样Mapper中的每条语句执行一次都会清空一级缓存。如果需要改变一级缓存的范围,可以在Mybatis配置文件的localCacheScope下指定。\Mybatis二级缓存1、为什么需要Mybatis二级缓存?MyBatis一级缓存最大的共享范围在一个SqlSession内部,所以如果多个SqlSession需要共享缓存,需要开启二级缓存。\2。Mybatis二级缓存的实现启用二级缓存后,Executor会被CachingExecutor修饰。在进入一级缓存的查询流程之前,二级缓存的查询会在CachingExecutor中进行。具体工作流程如下。启用二级缓存后,同一个命名空间下的所有操作语句都会影响同一个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期》系列文章作者,分享十余年架构经验和面试心得!更多互联网架构Java并发|JVM|MySQL|技术文章阅读mikechen合集Spring|Redis|分布式|高并发|架构师关注《Mikechen的互联网架构》公众号,回复【架构】获取我的原创《300 期 + BAT 架构技术系列与 1000 + 大厂面试题答案》