MyBatis的缓存

1. MyBatis的一级缓存

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

        使一级缓存失效的四种情况:

        1. 不同的SqlSession对应不同的一级缓存

        2. 同一个SqlSession但是查询条件不同

        3. 同一个SqlSession两次查询期间执行了任何一次增删改操作

        4. 同一个SqlSession两次查询期间手动清空了缓存

2. MyBatis的二级缓存

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

        二级缓存开启的条件:

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

        b>在映射文件中设置标签<cache/>

        c>二级缓存必须在SqlSession关闭或提交之后有效

        d>查询的数据所转换的实体类类型必须实现序列化的接口

        使二级缓存失效的情况:

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

3. 二级缓存的相关配置

        在mapper配置文件中添加的cache标签可以设置一些属性:

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

        LRU(Least Recently Used最近最少使用的:移除最长时间不被使用的对象。

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

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

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

        ②flushInterval属性:刷新间隔,单位毫秒

        默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

        ③size属性:引用数目,正整数

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

        ④readOnly属性:只读, true/false

        true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了 很重要的性能优势。

        false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false

4. MyBatis缓存查询的顺序

        先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。 如果二级缓存没有命中,再查询一级缓存

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

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

5. 整合第三方缓存EHCache

        5.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>

        5.2 jar包功能

jar包名称

作用

mybatis-ehcache

MybatisEHCache的整合包

ehcache

EHCache核心包

slf4j-api

SLF4J日志门面包

logback-classic

支持SLF4J门面接口的一个具体实现

        5.3 创建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="D:\softeem\ehcache"/>
<defaultCache
maxElementsInMemory="1000" maxElementsOnDisk="10000000" eternal="false" overflowToDisk="true" timeToIdleSeconds="120" timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>

        5.4 设置二级缓存的类型


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

        5.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.softeem.crowd.mapper" level="DEBUG"/>
</configuration>

        5.6 EHCache配置文件说明

属性名

是否必须

作用

maxElementsInMemory

在内存中缓存的element的最大数目

maxElementsOnDisk

在磁盘上缓存的element的最大数目,若是0表示无 穷大

eternal

设定缓存的elements是否永远不过期。 如果为

true,则缓存的数据始终有效, 如果为false那么还要根据timeToIdleSecondstimeToLiveSeconds 判断

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

        Ehcache 是一个广泛使用的开源 Java 运行时缓存库,主要用于提升应用程序的性能和效率。其具体作用体现在以下几个关键方面:
        1.性能提升:
        减少数据库访问:Ehcache 将常用数据或计算结果存储在内存中,使得应用程序在需要这些数据时可以直接从缓存获取,而非每次都去数据库进行查询。由于内存访问的速度远快于磁盘(数据库通常基于磁盘存储),这种机制极大地减少了对数据库的访问次数,显著提高了数据访问速度,特别是对于读操作密集的应用程序来说效果尤为显著。
        降低响应时间:通过缓存数据,Ehcache 缩短了应用程序处理请求所需的时间,进而降低系统的响应时间,提升用户体验。
        2.数据缓冲:
        缓解后端压力:在系统高峰时段或负载较大时,大量的数据请求可能会导致数据库成为性能瓶颈。Ehcache 作为数据缓冲层,能够存储一部分频繁访问的数据,从而减轻数据库的负担,分散高并发请求的影响。
        提高系统稳定性与可用性:通过减少对数据库的依赖,Ehcache 可以帮助保持系统的稳定运行,即使在数据库短暂不可用或响应变慢的情况下,仍能为部分请求提供服务,提高整体系统的可用性。
        3.资源优化:
        内存管理:Ehcache 允许配置缓存的最大内存容量,确保在有限的硬件资源下合理利用内存。当达到预设的内存限制时,会根据配置的缓存淘汰策略来决定哪些数据应被移出缓存,以维持缓存的高效运作。
        磁盘存储(可选):Ehcache 支持将部分数据溢出到磁盘,以应对大规模数据缓存需求或在内存不足时提供额外存储空间。虽然磁盘访问速度较慢,但对于不常访问或非关键路径的数据,仍能提供比直接数据库访问更快的响应。
        4.数据一致性维护(配合应用程序逻辑):
        缓存更新策略:Ehcache 提供了多种缓存更新策略(如读写模式、只读模式、同步/异步刷新等),帮助开发者在性能和数据新鲜度之间做出权衡。应用程序需结合特定业务场景和数据库事务处理机制,确保在数据发生变更时及时更新缓存,以保持缓存与数据库间的一致性。
        综上所述,Ehcache 在 Java 应用程序中的核心作用是通过提供高效的内存数据存储,减少对后端数据库的依赖,进而提升系统性能、响应速度、稳定性和资源利用率。同时,它还支持灵活的配置和多种缓存策略,以适应不同应用场景的需求

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值