首页 > 其他分享 >05. MyBatis缓存

05. MyBatis缓存

时间:2022-09-29 20:36:50浏览次数:52  
标签:缓存 05 SqlSession 查询 二级缓存 MyBatis element logback

一、MyBatis的一级缓存

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

  一级缓存失效的四种情况

  • 不同的 SqlSession 对应不同的一级缓存
  • 同一个 SqlSession 但是查询条件不同
  • 同一个 SqlSession 两次查询期间执行了任何一次增删改查操作
  • 同一个 SqlSession 两次查询期间手动清空了缓存

二、MyBatis的二级缓存

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

  二级缓存开启的条件

  1. 在核心配置文件中,设置全局配置属性 cacheEnabled="true",默认为 true,不需要设置
  2. 在映射文件中设置标签 <cache>
  3. 二级缓存必须在 SqlSession 关闭或提交之后有效
  4. 查询的数据所转换的实体类类型必须实现序列化的接口

  二级缓存失效的情况

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

  二级缓存的相关配置

  • eviction 属性:缓存回收策略,默认的是 LRU。

    • LRU(Least Recently Used):最近最少使用的:移除最长时间不被使用的对象。
    • FIFO(First in First out):先进先出:按对象进入缓存的顺序来移除它们。
    • SOFT:软引用:移除基于垃圾回收器状态和软引用规则的对象。
    • WEAK:弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
  • flushInterval 属性:刷新间隔,单位毫秒

    • 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
  • size 属性:引用数目,正整数

    • 代表缓存最多可以存储多少个对象,太大容易导致内存溢出
  • readOnly 属性:只读, true/false

    • true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
    • false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。

MyBatis缓存查询的顺序

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
如果二级缓存没有命中,再查询一级缓存。
如果一级缓存也没有命中,则查询数据库
SqlSession 关闭之后,一级缓存中的数据会写入二级缓存

三、MyBatis整合第三方缓存

3.1、添加配置

<!-- Mybatis EHCache整合包 --> 
<dependency> 
    <groupId>org.mybatis.caches</groupId> 
    <artifactId>mybatis-ehcache</artifactId> 
    <version>1.2.1</version> 
</dependency> 
  
<!-- slf4j日志门面的一个具体实现 --> 
<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version> 
</dependency>

3.2、各jar包功能

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

3.3、创建EHCache的配置文件

  创建 EHCache 的配置文件,配置文件名为 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="E:\Program\Java\MyBatis\ehcache"/>
    <defaultCache
            maxElementsInMemory="1000"
            maxElementsOnDisk="10000000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>

3.4、设置二级缓存的类型

  在 MyBatis 的映射文件中设置二级缓存的类型。

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

3.5、加入logback日志

  存在 SLF4J 时,作为简易日志的 log4j 将失效,此时我们需要借助 SLF4J 的具体实现 logback 来打印日志。 创建 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="com.atguigu.crowd.mapper" level="DEBUG"/> 
</configuration>

3.6、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(先进先出)

标签:缓存,05,SqlSession,查询,二级缓存,MyBatis,element,logback
From: https://www.cnblogs.com/nanoha/p/16742957.html

相关文章

  • AGC053C
    先考虑两个牌堆固定了的话,最小操作次数是什么。不妨假设两个牌堆为\(A,B\),并且\(2n\)在牌堆\(B\)中,则最后的目标是将\(A\)删空。结论:设\(d=\max\limits_{i=1}^{n......
  • Cache缓存帮助类
    publicclassCache{privatestaticCache_cache=HttpRuntime.Cache;///<summary>///本地缓存获取///</summary>///<paramname="name"......
  • mybatis 参数为String,用_parameter 取值
    mybatis参数为String,iftest读取该参数代码:<selectid="getMaxDepartId"parameterType="java.lang.String"resultType="java.lang.String">SELECTMAX(DEPART_ID......
  • mybatis中大于等于小于等于的写法
    第一种写法(1):原符号<<=>>=&'"替换符号<<=>>=&amp;&apos;"例如:sql如下:create_date_time>=#{startTime}andcreate_date_time<=#{endTime} 第二种写法......
  • MyBatisPlus入门
    1、MyBatisPlus简介MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率。官网:https://mybatis.plus/  https://mp.baomidou.com/1.1、......
  • Spring(十五):Spring整合MyBatis的两种方式
    在学习之前,我们先了解一个网站mybatis-spring,这是mybatis-spring整合的官方文档,里面有详细的教程,网址如下:https://mybatis.org/spring/zh/index.html一、什么是mybatis-s......
  • linux复制其他服务器的yum缓存使用
    CENTOS安装mysql-wsrep集群时,需要安装很多依赖包,可以提前在一台系统环境相同的虚拟机或者能连公网的服务器上提前缓存。1、在A机器上配置yum缓存设置,并提前设置好网络yum......
  • DP4056锂电池保护电源芯片兼容TP4056LTC4056
    dp4056是一款完整的单字节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的SOP8/MSOP封装与较少的外部元件数目使得成为便携式应用的理想选择。可以适合U......
  • MySQL5.7及以上版本:1055错误解决
    今天在迁移数据库到服务器,再运行本地的查询语句时出现1055错误。该错误是关于groupby的,原因是MySql5.7以上,sql_mode中的“only_full_group_by”是默认开启的解决方案......
  • wazuh hids爆破攻击检测——可以看到wazuh是将爆破的原始事件缓存了,最终取证输出。
    可以去申请一个商业版的试用:https://console.cloud.wazuh.com我的如下(我安装的是linux版本):       使用hydra在kali下做暴力破解攻击。==》可以看到wazu......