• Mybatis 12


    12.1 二级缓存


    1. 开启 二级缓存(全局缓存)
     <settings>
            <setting name="cacheEnabled" value="true"/>
        </settings>
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    1. 在想要 使用 二级缓存的 Mapper.xml 中 添加 <cache> 标签

    在这里插入图片描述

    1. 添加完标签后,xml 里面 select 标签 都会默认 使用缓存,如果 想让某个 标签 不适用缓存,则 还需要 配置 属性。
     <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    4. 我们还可以 去配置 下 二级缓存的 属性,以达到 某种缓存效果。

        <cache eviction="FIFO"
               flushInterval="60000"
               size="512" 
               readOnly="true"
        />
    
    • 1
    • 2
    • 3
    • 4
    • 5

    eviction回收的策略,在上一个文章其中一个图片里面,有写到。
    flushInterval : 间隔 多久刷新 一次缓存。
    size :缓存存储 的 最大 体积。(最小只能设置为 1,是一个正整数。)
    readOnly : true/false(true 的话 就是读取 相同的实例对象,false 就是 读 拷贝体。所以 false 相对来说 还比较安全。但是 你去 查询的时候 可能 会报错,因为 它 进行 比对的 是 地址,拷贝体嘛,那肯定是 相同数据 实例 才能 查到呀,如果不是相同数据 实例,那肯定 就 不满足 SQL 呀,所以 这个地方 一般 都要 手动设置为 true!

    • 二级缓存 也叫 全局缓存,作用域 非常的高,可以 应用于 所有的 查询。
    • 基于 namespace 级别的缓存,一个 命名空间,就能对应一个 二级缓存。
    • 工作原理
    • 一个会话 查询一条数据,这个数据就会 被 放在 当前 会话的 一级缓存中。

    • 如果 当前会话 关闭了,那么这个会话 的一级缓存 也就没有了。但是 会被 数据 保存到 二级缓存中。

    • 所以 新的会话 查询数据时,就可以 从 二级 缓存 中 获取内容。

    • 不同的 mapper 查出的数据 会 放在 自己 对应的缓存中(map) 中。

    如果 FIFO 策略的话,你还需要 开启 序列化!否则 不满足策略,就会报错!所以 看下面

    在这里插入图片描述

    小结:

    • 只要 开启了 二级缓存,那么 一个 Mapper 就相当于 一个 命名空间。
    • 所有的 数据 都会先放在 一级缓存中。
    • 只有 当 会话 提交,或者 关闭 之后,才会 转存到 二级缓存。

    12.2 缓存的原理

    在这里插入图片描述
    先 去 看下 二级缓存 有没有,如果没有 再去 看 对应的一级缓存 有没有,如果还是没有,那么 就 去查 数据库了。查完后 保存到 对应的 一级缓存里。如果一级缓存 关闭了,那么 就 转存到 二级缓存里。


    12.3 Mybatis-ehcache 自定义的分布式缓存

    1. 用 maven 导入 ehcache 的包
    <!-- 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 写一个 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    1. <cache> 标签 配置 ehcache 缓存
        <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    
    • 1
    1. 自定义 缓存类

    如果 你只是 单纯的 去 实现 原生态的 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);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    在这里插入图片描述


    12.4 Cache 原生态的 共享方法

    比如 A Mapper 想要 拿到 B Mapper 的缓存,那么你就可以 在 A Mapper.xml 里面写上 下面的 标签。

    <cache-ref namespace="xxx.xxx.xxx.xxx.BMapper"/>
    
    • 1

    一个标签,就可以实现 这样的功能,但 在 实际开发中,几乎 用不到。

    我们 做 分布式 和 集群 用的 也是 redis 做缓存了。连 ehcache 其实 都 很少能用到。cache 用到的 可能还会多点。

  • 相关阅读:
    UE像素流,来颗“减肥药”吧!
    《C++ Primer》学习笔记
    当下、百年之计与蝼蚁一生——读《原则2 :应对变化中的世界秩序》(下)...
    Java解析JSON数据
    Web前端小组考核总结
    华为OD机试:路灯照明问题(100分)
    基于小程序实现的餐饮外卖系统
    CSS实现超链接标签:鼠标光标为手形、取消下划线、当鼠标悬停时显示下划线
    中央设备状态监控系统CMS如何帮助半导体晶圆厂提高产品良率
    信息系统项目管理师 第四版 第4章 信息系统管理
  • 原文地址:https://blog.csdn.net/qq_52606908/article/details/125563904