Mybatis源码分析之Cache二级缓存原理 (五)

一:Cache类的介绍

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

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

看下cache的实现类,如下图:

Mybatis源码分析之Cache二级缓存原理 (五)_第1张图片

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

 

二:二级缓存初始化

Mybatis默认对二级缓存是关闭的,一级缓存默认开启,如果需要开启只需在mapper上加入

二级缓存是怎么初始化的呢?

我们在之前的文章里面(Mybatis源码分析之SqlSessionFactory(一))分析了配置文件的加载,我们回到那边来找到二级缓存的加载地方,一开始我就说了“如果需要开启只需在mapper上加入

XMLConfigBuilder.parse-->parseConfiguration(XNode root)-->mapperElement(root.evalNode("mappers"))-->
mapperElement(XNode parent)

看下mapperElement的方法

private void mapperElement(XNode parent) throws Exception {
if (parent != ) {
for (XNode child : parent.getChildren) {
if ("package".equals(child.getName)) {
String mapperPackage = child.getStringAttribute("name");
configuration.addMappers(mapperPackage);
} else {
String resource = c

你可能感兴趣的:(Mybatis源码分析之Cache二级缓存原理 (五))