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下指定。
