本文转载于:Mybatis一级缓存与二级缓存的区别你知道吗
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 查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。当执行两次查询的中间发生了增、删、改的操作 commit 后,则 SqlSession 的缓存会被清空
。
Mybatis 的内部缓存使用一个HashMap
,key 为hashcode
+statementId
+sql
语句。value 为查询出来的结果集映射成的 Java 对象。
2) Mybatis二级缓存是默认不开启的,作用于一个 Application,是 Mapper 级别的,多个 SqlSession 使用同一个 Mapper 的 sql 就能够使用二级缓存。
标签:缓存,一级,SqlSession,查询,二级缓存,Mybatis From: https://www.cnblogs.com/cloudrich/p/17460863.html