<settings>
<setting name="cacheEnabled" value="true"/>
</settings>

<cache> 标签
<select id="queryBlogIF" parameterType="map" resultType="top.muquanyu.pojo.Blog"
useCache="false">
select * from test.blog
<trim prefix="where" prefixOverrides="and || or" suffixOverrides=",">
<include refid="if-title-author"></include>
</trim>
</select>

4. 我们还可以 去配置 下 二级缓存的 属性,以达到 某种缓存效果。
<cache eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"
/>
eviction : 回收的策略,在上一个文章其中一个图片里面,有写到。
flushInterval : 间隔 多久刷新 一次缓存。
size :缓存存储 的 最大 体积。(最小只能设置为 1,是一个正整数。)
readOnly : true/false(true 的话 就是读取 相同的实例对象,false 就是 读 拷贝体。所以 false 相对来说 还比较安全。但是 你去 查询的时候 可能 会报错,因为 它 进行 比对的 是 地址,拷贝体嘛,那肯定是 相同数据 实例 才能 查到呀,如果不是相同数据 实例,那肯定 就 不满足 SQL 呀,所以 这个地方 一般 都要 手动设置为 true!)
一个会话 查询一条数据,这个数据就会 被 放在 当前 会话的 一级缓存中。
如果 当前会话 关闭了,那么这个会话 的一级缓存 也就没有了。但是 会被 数据 保存到 二级缓存中。
所以 新的会话 查询数据时,就可以 从 二级 缓存 中 获取内容。
不同的 mapper 查出的数据 会 放在 自己 对应的缓存中(map) 中。
如果 FIFO 策略的话,你还需要 开启 序列化!否则 不满足策略,就会报错!所以 看下面

小结:

先 去 看下 二级缓存 有没有,如果没有 再去 看 对应的一级缓存 有没有,如果还是没有,那么 就 去查 数据库了。查完后 保存到 对应的 一级缓存里。如果一级缓存 关闭了,那么 就 转存到 二级缓存里。
<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.2</version>
</dependency>
ehcache.xml 配置文件<?xml version="1.0" encoding="UTF-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="./tmpdir/Tmp_EhCache"/>
<defaultCache
eternal="false"
maxElementsInMemory="10000"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="259200"
memoryStoreEvictionPolicy="LRU"/>
<cache
name="cloud_user"
eternal="false"
maxElementsInMemory="5000"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="1800"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
自定义 缓存类如果 你只是 单纯的 去 实现 原生态的 Cache 接口的话,你会感觉 很 烦。因为 都需要你自己 去写。

但是 如果你 直接 继承 AbstractEhcacheCache 类,你点进去 源码一看,就会发现 这个类 帮你实现了 好多 功能。
package top.muquanyu.utils;
import org.apache.ibatis.cache.Cache;
import org.mybatis.caches.ehcache.AbstractEhcacheCache;
public class MyCache extends AbstractEhcacheCache {
public MyCache(String id) {
super(id);
if(!CACHE_MANAGER.cacheExists(id)){
CACHE_MANAGER.addCache(id);
}
this.cache = CACHE_MANAGER.getEhcache(id);
}


比如 A Mapper 想要 拿到 B Mapper 的缓存,那么你就可以 在 A Mapper.xml 里面写上 下面的 标签。
<cache-ref namespace="xxx.xxx.xxx.xxx.BMapper"/>
一个标签,就可以实现 这样的功能,但 在 实际开发中,几乎 用不到。
我们 做 分布式 和 集群 用的 也是 redis 做缓存了。连 ehcache 其实 都 很少能用到。cache 用到的 可能还会多点。