首页 > 其他分享 >Mybatis配置-缓存策略

Mybatis配置-缓存策略

时间:2024-03-21 19:29:05浏览次数:15  
标签:Mapper 缓存 配置 SqlSession MyBatis 二级缓存 SQL Mybatis

MyBatis 缓存全面详解


一、缓存概述


1. 定义


缓存是一种存储技术,用于临时存储最近访问的数据,以便在需要时可以快速访问。通过减少对持久层的访问次数,缓存可以显著提高应用程序的性能和响应速度。


2. 特点


高速访问:缓存的存在减少了对数据库的访问,从而加快了数据的读取速度。
减少数据库压力:缓存减少了对数据库的频繁访问,降低了数据库的负载。
提高系统性能:缓存能够提高应用程序的响应速度,提升用户体验。


二、MyBatis 缓存机制

MyBatis 提供了两层缓存机制:一级缓存(Local Cache)和二级缓存(Second Level Cache)。

 一级缓存


定义与特点


一级缓存是基于 SqlSession 级别的缓存,它是一个私有的、本地的缓存区域。一级缓存默认开启,它的作用范围是当前 SqlSession,当 SqlSession 关闭时,一级缓存随之失效。


工作原理


MyBatis 在执行 SQL 查询时,首先会检查一级缓存中是否已经存在相同 SQL 和参数的结果。如果存在,直接返回结果;如果不存在,则执行 SQL 查询,将结果存入一级缓存,并返回结果。


失效机制


当执行 CRUD(增删改) 操作时,一级缓存会失效,因为这些操作可能影响到查询结果。
当关闭 SqlSession 时,一级缓存也会失效。


二级缓存


定义与特点


二级缓存是基于 Mapper 接口级别的缓存,它是一个全局的缓存区域。二级缓存可以跨 SqlSession 共享数据,它的作用范围是整个 Mapper 接口。


工作原理


MyBatis 在执行 SQL 查询时,首先会检查二级缓存中是否已经存在相同 SQL 和参数的结果。如果存在,直接返回结果;如果不存在,则执行 SQL 查询,将结果存入二级缓存,并返回结果。


失效机制


当执行 CRUD 操作时,二级缓存会失效,因为这些操作可能影响到查询结果。
当 Mapper 接口中的 SQL 语句发生变化时,二级缓存会失效。
当关闭 Mapper 接口时,二级缓存也会失效。

全局配置文件(mybatis-config.xml)中启用二级缓存并设置全局属性:

<configuration>
    <!-- 启用二级缓存 -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <!-- 其他全局配置... -->
</configuration>

Mapper 映射文件中配置二级缓存具体参数:

<mapper namespace="com.example.mapper.UserMapper">
    <!-- 开启该 mapper 的二级缓存,并配置缓存策略、容量大小等 -->
    <cache eviction="LRU" size="1024" />

    <!-- 查询语句或其他 SQL 映射... -->
    <select id="getUserById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

注意,这里的 <cache> 标签是用来配置二级缓存的具体参数的,如驱逐策略(eviction)、缓存容量大小(size)等。
然而,在实际项目中,MyBatis 的二级缓存往往需要结合具体的缓存插件使用,例如 Ehcache 或 Redis 等第三方缓存工具,以提供更强大的功能,比如过期时间设置、分片管理以及更多的驱逐策略选择等。这部分配置通常会在对应的缓存插件的配置文件中完成,而不是直接在 MyBatis 的 XML 配置文件中体现。
以下是一个使用 Ehcache 作为二级缓存实现时,在 Ehcache 的配置文件(ehcache.xml)中的部分配置示例:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd">

    <diskStore path="java.io.tmpdir"/>

    <cache name="com.example.mapper.UserMapper"
           maxEntriesLocalHeap="1000"
           eternal="false"
           timeToLiveSeconds="3600"
           memoryStoreEvictionPolicy="LRU">
    </cache>

    <!-- 其他缓存区域配置... -->
</ehcache>

在这个例子中,我们为 UserMapper 配置了一个 Ehcache 缓存,设置了最大内存条目数、生存时间以及其他相关参数。这样,MyBatis 的二级缓存就会利用 Ehcache 提供的功能进行更高效的缓存管理。

 

查找顺序


当执行一个查询操作时,MyBatis 会先检查一级缓存(SqlSession 级别),若未命中,则继续查找二级缓存(Mapper 接口级别)。
若二级缓存中存在匹配的结果,则直接返回;否则,从数据库获取数据,并将结果分别存入一级缓存和二级缓存(根据配置决定是否存入二级缓存)。


4. 颗粒度详解


一级缓存的颗粒度:SqlSession 级别,作用范围是当前 SqlSession。
二级缓存的颗粒度:Mapper 接口级别,作用范围是整个 Mapper 接口。


数据一致性


为了保证缓存中的数据与数据库中的数据一致性,MyBatis 提供了一些策略,如在执行 CRUD 操作时自动清空缓存,以及在缓存中存储数据的版本信息等。

配置作用与好处

配置配置 MyBatis 缓存的主要目的是为了优化数据访问性能和资源利用率。通过合理设置缓存参数,可以带来以下好处:


提升查询性能:启用缓存后,对于相同的 SQL 查询,MyBatis 可以避免多次执行相同查询语句,从而显著降低数据库负担并提高应用程序响应速度。


节省系统资源:在高并发场景下,缓存能够有效减轻数据库服务器的压力,减少对硬件资源的消耗。


跨会话共享数据:二级缓存尤其适用于那些数据更新频率较低且需要跨多个 SqlSession 共享结果集的应用场景,如用户信息、静态数据等。


精细化控制:MyBatis 的缓存支持粒度级别的配置,允许开发人员针对不同业务需求选择性地开启或关闭缓存,以及调整缓存容量、驱逐策略等属性。


数据一致性保障:虽然缓存提高了性能,但也带来了数据一致性的挑战。通过正确配置缓存刷新策略和失效机制,可以确保缓存中的数据尽可能与数据库保持同步,防止出现因缓存导致的数据不一致问题。

标签:Mapper,缓存,配置,SqlSession,MyBatis,二级缓存,SQL,Mybatis
From: https://blog.csdn.net/weixin_49295523/article/details/136912975

相关文章

  • AWS EC2 实例和本地服务器配置 Amazon CloudWatch 代理
    为什么需要Cloudwatch代理本地服务器?统一的监控视图,高级数据分析和可视化,自动化的响应,简化日志管理,提高可靠性和可用性,符合合会性要求这样子做有什么好处?集中监控:CloudWatch代理使能够将本地服务器的监控数据,(如CPU使用率、内存消耗、网络流量和应用程序日志)发送到CloudW......
  • mybatis注解开发和事务配置以及mybatis缓存
    MyBatis注解开发注解方式比较简单,但是实际开发不推荐使用注解,使用配置文件的方式,不需要改源代码。@Insert:添加@Update:修改@Delete:删除@Select:查询@Result:实现结果集封装@Results:可以和@Result一起使用,封装多个结果集@One:实现一对一和多对一的结果集封装@Man......
  • 本地搭建深度学习训练环境(配置conda环境 cuda pytorch...)
    目录简介Nvidia驱动和cudatoolKit简介首先我们要下载的东西包括:anaconda(虚拟环境管理)pycharm(代码项目编辑器)Nvidia驱动和cudatoolKitpytorch(最好使用wheel)其中,anaconda和pycharm的下载比较简单,这里不在赘述。主要讲解后两个:Nvidia驱动和cudatoolKitNvidia驱动是向......
  • 如何在极狐GitLab Runner 添加信任缓存域名证书
    本文作者:徐晓伟GitLab是一个全球知名的一体化DevOps平台,很多人都通过私有化部署GitLab来进行源代码托管。极狐GitLab是GitLab在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。问题参见:场景是极狐GitLabRunner添加MinIO域名host的时候却无法验证......
  • 积木报表配置报表
    1.新建报表2.选择数据集来源——SQL数据集3.选择数据源维护数据源可以配置多个数据源点击“新增”按钮,弹出配置的新增窗口,根据自己需要的数据库配置 4.填写编码(配置报表的时候要用)、名称,快速生成sql,也可以自己写5.获取sql中的数据,配置报表 6.保存,填写名称7......
  • 若依基本框架内容介绍、多数据源配置、命令、自定义打包脚本
    若依是一个能够帮助我们快速搭建一个管理平台的开发框架官网地址:https://doc.ruoyi.vip/ruoyi/ 一、基本框架内容介绍二、多数据源配置三、命令、自定义打包脚本 一、基本框架内容1.文件结构Common:用的比较多的是utils包中的工具(处理字符串、日期、获取ip、发送请求、......
  • MyBatis的关联映射
    资料下载链接MyBatis的关联映射-1V1MyBatis的关联映射-1VnMyBatis的关联映射-nVn一、需求分析        掌握一对一关联映射,掌握一对多关联映射,掌握多对多关联映射。二、搭建环境1)数据库环境        mybatis数据库,运行mybatistest04.sql2)引......
  • 一个基于配置文件构建有向无环图,并多线程运行图上节点的例子
    #include<iostream>#include<memory>#include<thread>#include<vector>classNode{public:virtualvoidshow()=0;virtualboolhasFinished(){returnhas_finished_;}protected:boolhas_finished_=false;};classA......
  • 配置设置
    安装时设置网络端口在安装过程中,安装程序尝试在端口上启动Web服务器0.0.0.0:9000。如果该端口已被使用,则启动失败。config.yaml您可以在启动EasyDiffusion之前通过在EasyDiffusion目录中创建一个文件来更改安装程序将使用的端口:net:listen_port:9000listen_t......
  • CCBD Win10环境配置
     (base)C:\Users\luo>(base)C:\Users\luo>nvidia-smiThuMar2110:54:512024+-----------------------------------------------------------------------------+|NVIDIA-SMI516.94DriverVersion:516.94CUDAVersion:11.7||----......