缓存

一级缓存

1、SqlSession 级别

2、通过同一个 SqlSession 查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问

3、默认开启

4、一级缓存失效的四种情况

(1)不同的 SqlSession 对应不同的一级缓存

(2)同一个 SqlSession,但是查询条件不同

(3)同一个 SqlSession,两次查询之间,执行了任何一次增删改操作

(4)同一个 SqlSession,两次查询之间,手动清空了缓存:SqlSession 对象调用 clearCache()

 

二级缓存

1、SqlSessionFactory 级别

2、通过同一个 SqlSessionFactory 创建的 SqlSession 查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取

3、开启条件

(1)在核心配置文件中,设置全局配置属性 cacheEnabled="true",默认为 true,不需要设置

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

(2)在映射文件中设置 <cache/> 标签

(3)二级缓存必须在 SqlSession 关闭(调用 close() 方法)或提交之后有效

(4)查询的数据所转换的实体类类型,必须实现 Serializable 接口

4、二级缓存失效的情况:两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

 

cache 标签

1、在 mapper 配置文件中添加,开启二级缓存

2、eviction 属性:缓存回收策略

(1)LRU:Least Recently Used,最近最少使用的:移除最长时间不被使用的对象;默认策略

(2)FIFO:First in First out,先进先出:按对象进入缓存的顺序来移除它们

(3)SOFT:软引用:移除基于垃圾回收器状态和软引用规则的对象

(4)WEAK:弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象

3、flushInterval 属性

(1)二级缓存的刷新间隔,单位为毫秒

(2)默认情况不设置,即没有刷新间隔,缓存仅仅调用增删改语句时刷新

4、size 属性

(1)引用数目,值为正整数

(2)代表缓存最多可以存储多少个对象,太大容易导致内存溢出

5、readOnly属性

(1)值为 true / false,默认为 false

(2)true:只读缓存,给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改,性能较高

(3)false:读写缓存;通过序列化返回缓存对象的拷贝,性能较低,但是安全

 

MyBatis 缓存查询顺序

1、先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以直接使用

2、如果二级缓存没有命中,再查询一级缓存

3、如果一级缓存也没有命中,则查询数据库

4、SqlSession 关闭之后,一级缓存中的数据会写入二级缓存

 

整合第三方缓存 EHCache

1、MyBatis 开放缓存接口,可以自定义第三方的二级缓存,但是无法改变一级缓存

2、添加依赖

<!-- Mybatis EHCache整合包 -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.2</version>
</dependency>

<!-- slf4j日志门面的一个具体实现 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.11</version>
    <scope>test</scope>
</dependency>

3、各个 jar 包的功能

jar 包名称 作用
mybatis-ehcache Mybatis 和 EHCache 的整合包
ehcache EHCache 核心包
slf4j-api SLF4J 日志门面包
logback-classic 支持 SLF4J 门面接口的一个具体实现

4、创建 EHCache 的配置文件

(1)配置文件名必须为:ehcache.xml

<?xml version="1.0" encoding="utf-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    
    <!-- 缓存的磁盘保存路径 -->
    <diskStore path="D:\atguigu\ehcache"/>
    
    <defaultCache>
            maxElementsInMemory="1000"
            maxElementsOnDisk="10000000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>
属性名 是否必须 作用
maxElementsInMemory 在内存中缓存的 element 的最大数目
maxElementsOnDisk 在磁盘上缓存的 element 的最大数目,若是 0 表示无穷大
eternal 设定缓存的 elements 是否永远不过期,若为 true,则缓存的数据始终有效, 若为 false,则还要根据 timeToIdleSeconds、timeToLiveSeconds 判断
overflowToDisk 设定当内存缓存溢出的时,是否将过期的 element 缓存到磁盘上
timeToIdleSeconds 当缓存在 EhCache 中的数据,前后两次访问的时间超过 timeToIdleSeconds 的属性取值时,则删除这些数据,默认值为 0,即可闲置时间无穷大
timeToLiveSeconds 缓存 element 的有效生命期,默认为 0,即 element 存活时间无穷大
diskSpoolBufferSizeMB DiskStore(磁盘缓存)的缓存区大小,默认 30MB,每个 Cache 都应该有自己的一个缓冲区
diskPersistent 在 VM 重启时,是否启用磁盘保存 EhCache 中的数据,默认为 false
diskExpiryThreadIntervalSeconds 磁盘缓存的清理线程运行间隔,默认为 120 秒,每 120s,相应的线程会进行一次 EhCache 中数据的清理工作
memoryStoreEvictionPolicy 当内存缓存达到最大,有新的element加入时,移除缓存中 element 的策略,默认为 LRU(最近最少使用),可选:LFU(最不常使用)、FIFO(先进先出)

5、映射文件设置二级缓存的类型

(1)默认 MyBatis

<cache/>

(2)选择 EHCache

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

6、加入 logback 日志

(1)存在 SLF4J 时,作为简易日志的 log4j 将失效,此时需要 SLF4J 的具体实现 logback 来打印日志

(2)创建 logback 的配置文件 logback.xml,文件名固定,不可改变

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 指定日志输出的位置 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出的格式 -->
            <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
            <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
        </encoder>
    </appender>
    <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
    <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志 -->
    <root level="DEBUG">
        <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
        <appender-ref ref="STDOUT" />
    </root>
    <!-- 根据特殊需求指定局部日志级别 -->
    <logger name="org.test.mybatis.mapper" level="DEBUG"/>
</configuration>
posted @   半条咸鱼  阅读(142)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示