Mybatis源码学习——二级缓存

二级缓存

一级缓存是作用范围是在selSession,当然也有失效的情况,上面我们已经说过了,下面看二级缓存。

1.Cache

讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(ServiceProvider Interface) ,所有的MyBatis内部的Cache缓存,都应该实现这一接口。

Cache的实现类中,Cache有不同的功能,每个功能独立,互不影响,则对于不同的Cache功能,这里使用了装饰者模式实现。

// 实现Cache接口的类
1.FIFOCache:先进先出算法 回收策略,装饰类,内部维护了一个队列,来保证FIFO,一旦超出指定的大小,则从队列中获取Key并从被包装的Cache中移除该键值对。
2.LoggingCache:输出缓存命中的日志信息,如果开启了DEBUG模式,则会输出命中率日志。
3.LruCache:最近最少使用算法,缓存回收策略,在内部保存一个LinkedHashMap
4.ScheduledCache:定时清空Cache,但是并没有开始一个定时任务,而是在使用Cache的时候,才去检查时间是否到了。
5.SerializedCache:序列化功能,将值序列化后存到缓存中。该功能用于缓存返回一份实例的Copy,用于保存线程安全。
6.SoftCache:基于软引用实现的缓存管理策略,软引用回收策略,软引用只有当内存不足时才会被垃圾收集器回收
7.SynchronizedCache:同步的缓存装饰器,用于防止多线程并发访问
8.PerpetualCache 永久缓存,一旦存入就一直保持,内部就是一个HashMap
9.WeakCache:基于弱引用实现的缓存管理策略
10.TransactionalCache 事务缓存,一次性存入多个缓存,移除多个缓存
11.BlockingCache 可阻塞的缓存,内部实现是ConcurrentHashMap
2.默认通过CachingExecutor来装饰exector

也可以通过配置文件关闭

<settings>
	<setting name="cacheEnabled" value="false">
</settings>
image-20220920160250997
3.二级缓存的作用域

image-20220920160934502

4.装饰器中的query语句
1、当为select语句时:
flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
useCache默认为true,表示会将本条语句的结果进行二级缓存。
2、当为insert、update、delete语句时:
flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。
useCache属性在该情况下没有。
当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的,所以,如果有必要,那么就需要人工修改配置。
image-20220920160216761

需要注意的是这里的存到暂存区是存储到一个中间map(entriesToAddOnCommit)中,当然这个数据也在一级缓存中存在,而并没有添加到我们的二级缓存里面,只有当事务提交的时候才是真正加入到二级缓存,所以在一个事务中,如果你没有提交,是在二级缓存中查不到的

事务提交,session提交,提交是层层调用的。最终调用到CachingExecutor的commit,其中调用tcm的commit

image-20220920164153001
5.使用二级缓存需要注意:
  1. 对该表的操作与查询都在同一个namespace下,其他的namespace如果有操作,就会发生数据过时。因为二级缓存是以namespace为单位的,不同namespace下的操作互不影响。

  2. 对关联表的查询,关联的所有表的操作都必须在同一个namespace。

  3. 不能直接操作数据库,否则数据查询结果会存在问题

  4. 实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值