Mybatis二级缓存详解

news2025/1/11 16:54:21

目录

二级缓存

MyBatis的缓存机制整体设计以及二级缓存的工作模式

二级缓存的划分

使用二级缓存,必须要具备的条件

一级缓存和二级缓存的使用顺序

二级缓存实现的选择

MyBatis自身提供的二级缓存的实现

二级缓存的作用

二级缓存的作用域

二级缓存应用场景

二级缓存局限性

二级缓存的思考


  • 二级缓存

  • MyBatis的二级缓存是Application应用级别的缓存
  • 多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的
  • 二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache
  • MyBatis的缓存机制整体设计以及二级缓存的工作模式

  • 当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章
  • 如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor
  • 这时SqlSession使用CachingExecutor对象来完成操作请求
  • CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果
  • 如果有查询结果,则直接返回缓存结果
  • 如果缓存中没有,再交给真正的Executor对象来完成查询操作
  • 之后CachingExecutor会将真正的Executor返回的查询结果放置到缓存中,然后再返回给用户
  • CachingExecutor是Executor的装饰者,以增强Executor的功能,使其具有缓存查询的功能,这里用到了设计模式中的装饰者模式
  • 二级缓存的划分

  • MyBatis并不是简单地对整个Application就只有一个Cache缓存对象
  • 它将缓存划分的更细,即是Mapper级别的,即每一个Mapper都可以拥有一个Cache对象,具体如下:
    • (1)为每一个Mapper分配一个Cache缓存对象(使用<cache>节点配置)
      • MyBatis将Application级别的二级缓存细分到Mapper级别
      • 即对于每一个Mapper.xml,如果在其中使用了<cache>节点,则MyBatis会为这个Mapper创建一个Cache缓存对象
      • 例:对于namespace1和namespace2两个Mapper,都配置了<cache>会分别为这两个Mapper根据配置信息创建一个Cache对象
      • 而namespace3的Mapper,没有配置<cache>节点,则对于Mapper namespace3就没有对应的二级缓存
      • 上述的每一个Cache对象,都会有一个自己所属的namespace命名空间,并且会将Mapper的namespace作为它们的ID
    • (2)多个Mapper共用一个Cache缓存对象(使用<cache-ref>节点配置)
      • 如果你想让多个Mapper公用一个Cache的话,你可以使用<cache-ref namespace="">节点,来指定这个Mapper使用到了哪一个Mapper的Cache缓存
      • 例:Mapper namespace2 的<cache-ref>定义的namespace="namespace1",说明Mapper namespace2 将使用Mapper namespace1中的Cache缓存对象,这时候要求namespace1中一定要有<cache>节点的定义
  • 使用二级缓存,必须要具备的条件

  • MyBatis对二级缓存的支持粒度很细,它会指定某一条查询语句是否使用二级缓存
  • 虽然在Mapper中配置了<cache>,并且为此Mapper分配了Cache对象,但这并不表示我们使用Mapper中定义的查询语句查到的结果都会放置到Cache对象之中
  • 我们必须指定Mapper中的某条选择语句是否支持缓存,即如下所示:
  • 在<select>节点中配置useCache="true",Mapper才会对此Select的查询支持缓存特性,否则,对此Select查询不会经过Cache缓存
  • 如下所示,Select语句配置了useCache="true",则表明这条Select语句的查询会使用二级缓存

  • 总之,要想使某条Select查询支持二级缓存,你需要保证:
    • 1. MyBatis支持二级缓存的总开关:全局配置变量参数 cacheEnabled=true
    • 2. 该select语句所在的Mapper,配置了<cache>或<cached-ref>节点,并且有效
    • 3. 该select语句的参数 useCache=true
  • 一级缓存和二级缓存的使用顺序

  • 请注意,如果你的MyBatis使用了二级缓存,并且你的Mapper和select语句也配置使用了二级缓存
  • 那么在执行select查询的时候,MyBatis会先从二级缓存中取输入,其次才是一级缓存
  • 即MyBatis查询数据的顺序是:二级缓存——> 一级缓存——> 数据库
  • 二级缓存实现的选择

  • MyBatis对二级缓存的设计非常灵活,它自己内部实现了一系列的Cache缓存实现类,并提供了各种缓存刷新策略如LRU,FIFO等等
  • 另外,MyBatis还允许用户自定义Cache接口实现,用户是需要实现org.apache.ibatis.cache.Cache接口,然后将Cache实现类配置在<cache type="">节点的type属性上即可
  • 除此之外,MyBatis还支持跟第三方内存缓存库如Memecached的集成
  • 总之,使用MyBatis的二级缓存有三个选择:
    • 1.MyBatis自身提供的缓存实现
    • 2.用户自定义的Cache接口实现
    • 3.跟第三方内存缓存库的集成
  • MyBatis自身提供的二级缓存的实现

  • MyBatis自身提供了丰富的,并且功能强大的二级缓存的实现,它拥有一系列的Cache接口装饰者,可以满足各种对缓存操作和更新的策略
  • MyBatis定义了大量的Cache的装饰器来增强Cache缓存的功能,如下类图所示

  • 对于每个Cache而言,都有一个容量限制,MyBatis提供了各种策略来对Cache缓存的容量进行控制,以及对Cache中的数据进行刷新和置换
  • MyBatis主要提供了以下几个刷新和置换策略:
    • LRU(Least Recently Used):最近最少使用算法,即如果缓存中容量已经满了,会将缓存中最近做少被使用的缓存记录清除掉,然后添加新的记录
    • FIFO(First in first out):先进先出算法,如果缓存中的容量已经满了,那么会将最先进入缓存中的数据清除掉
    • Scheduled:指定时间间隔清空算法,该算法会以指定的某一个时间间隔将Cache缓存中的数据清空
  • 二级缓存的作用

  • 1.映射语句文件中的所有select语句将会被缓存
  • 2.映射语句文件中的所有insert、update和delete语句会刷新缓存
  • 3.缓存会使用默认的Least Recently Used(LRU,最近最少使用的)算法来清除不需要的缓存
  • 4.缓存不会定时进行刷新(也就是说,没有刷新间隔)
  • 5.缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用
  • 6.缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改
  • 二级缓存的作用域

  • 缓存只作用于 cache 标签所在的映射文件中的语句
  • 如果你混合使用 Java API 和 XML 映射文件,在共用接口中的语句将不会被默认缓存
  • 你需要使用 @CacheNamespaceRef 注解指定缓存作用域
  • 二级缓存应用场景

  • 对查询频率高,变化频率低的数据建议使用二级缓存
  • 对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度
  • 业务场景比如:耗时较高的统计分析sql、电话账单查询sql等
  • 二级缓存局限性

  • mybatis二级缓存对细粒度的数据级别的缓存实现不好
  • 比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大
  • 但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息
  • 因为mybatis的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空
  • 解决此类问题需要在业务层根据需求对数据有针对性缓存
  • 二级缓存的思考

  • 1.MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强
  • 2.MyBatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件比较苛刻
  • 3.在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口实现,有一定的开发成本,直接使用Redis、Memcached等分布式缓存可能成本更低,安全性也更高
  • 4.通常我们会为每个单表创建单独的映射文件,由于MyBatis的二级缓存是基于namespace的,多表查询语句所在的namspace无法感应到其他namespace中的语句对多表查询中涉及的表进行的修改,引发脏数据问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pruning 系列 (六)remove剪枝

环境 python 3.9numpy 1.24.1pytorch 2.0.0+cu117一、填0与remove剪枝的差异 直接填0的剪枝: 优点: 保留了原始网络结构,便于实现和微调。部分减少模型的计算量。缺点: 零权重仍然需要存储,因此不会减少内存使用。一些硬件和软件无法利用稀疏计算,从而无法提高计算效率…

Linux网络——shell编程之awk编辑器

Linux网络——shell编程之awk编辑器 一、awk编辑器1.概述2.工作流程3.常用选项 二、awk的基础用法1.输出文件中的某一列2.根据特定条件筛选数据3.按照分隔符进行切割4.在匹配到特定字符串时执行操作5.BEGIN打印模式6.awk的分隔符用法 三、示例演示1.获取本机上一次开机时间2.检…

Unity UI -- (1)概览

UI&#xff08;User Interface&#xff0c;用户接口&#xff09;&#xff0c;是让用户和计算机或计算机应用交互的接口系统。 在实时3D项目中&#xff0c;UI通常是由文本、按钮、复选框、滑动条和单选框等组合出来的界面。这些元素使用特定规则或通知和用户进行交互。 UI设计是…

路由信息协议(RIP)

文章目录 1 概述2 RIP 要点2.1 根据 距离矢量&#xff08;或 跳数&#xff09;寻找最佳路由2.2 RIP 三大要点2.3 基本工作过程2.4 路由条目的更新规则2.5 RIPv1 和 RIPv22.6 "坏消息传播慢" 的问题 3 网工软考真题 1 概述 #mermaid-svg-bIbiI8QAnQj8HX7d {font-famil…

Vivado综合属性系列之四 ROM_STYLE

目录 一、前言 二、ROM_STYLE 一、前言 ROM英文全称为Read Only Memory&#xff0c;只读存储器&#xff0c;里面主要存放固定的数据。 二、ROM_STYLE ROM的使用方式与RAM类似&#xff0c;格式样例为&#xff1a;(* rom_style"{distributed | block}" *)&#xff0…

C++类和对象入门

C类和对象入门 1. 面向过程和面向对象初步认识2. 类的引入3. 类的定义3.1 类的两种定义方式 4.类的访问限定符及封装4.1 访问限定符说明 5. 封装5. 类的作用域6. 类的实例化7. 类对象模型7.1 类对象存储规则7.2 如何计算类对象的大小 8. this指针总结 1. 面向过程和面向对象初步…

简述 JavaScript 被执行的那些事情

简述 JavaScript 被执行的那些事情 JavaScript 是脚本语言 JavaScript 是解释型语言 JavaScript 执行流程 不同浏览器有不同的 JavaScript 引擎&#xff08;运行时&#xff09;&#xff0c;主流的 JS 引擎有&#xff1a; V8&#xff0c;chromium 内核的引擎&#xff0c;主…

【ChatGPT4.0+PPT】使用NewBing搭配mindshow快速完成PPT任务

使用NewBing搭配mindshow快速完成PPT任务 前言一、使用NewBing生成PPT大纲二、粘贴Markdown到mindshow生成PPT三、结果展示四、扩展 前言 完成一个简单的PPT只需要两步&#xff1a; 使用NewBing生成PPT大纲粘贴Markdown到mindshow生成PPT 如果访问不了NewBing可以用国内Chat…

Minecraft外置登录服务器Little-Skin讲解

随着Minecraft的普及与发展&#xff0c;现在许多小伙伴是越来越爱上了MC。但是想玩国际正版岂是那么容易&#xff1f;或许你会说“HMCL不就是java启动器吗&#xff1f;”&#xff0c;这句话是没错&#xff0c;但是HMCL的都是离线账户。那么该怎么永远拥有一个稳定的账户呢&…

JVM 垃圾回收相关算法

垃圾标记阶段 对象存活判断: 在堆里存放着几乎所有的 Java 对象实例&#xff0c;在GC 执行垃圾回收之前&#xff0c;首先需要区分出内存中哪些是存活对象&#xff0c;哪些是已经死亡的对象。只有被标记为已经死亡的对象&#xff0c;GC 才会在执行垃圾回收时&#xff0c;释放掉…

简单介绍Qt Quick、QML以及Qt Widgets之间的区别与联系

作者&#xff1a;CCAccept 专栏&#xff1a;Qt Quick 文章目录 前言Qt WidgetsQt Widgets的发展Qt Widgets的优点Qt Widgets的应用场景 QML与Qt QuickQML的发展QML的优点QML的应用场景 总结 前言 之前都是一直在做Qt Widgets的项目&#xff0c;最近由于实验室要求&#xff0…

从零开始,教你如何写出好的品牌策划推广方案

要写出一份好的品牌策划推广方案其实并不难&#xff0c;道叔今天给你分享自己十年来在品牌策划行业内的一个经验干货&#xff0c;希望对你有所帮助。 首先&#xff0c;你要知道的是一份“合格”品牌策划方案需要必备的三个条件&#xff1a; 1、逻辑 品牌策划的逻辑决定了方案…

Vue实战笔记(三) 引入Quill Editor

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲如何在 Vue 中引入 Quill \text{Quill} Quill 1、背景介绍 在前端开发中&#xff0c;富文本编辑器是一个重要的功能组件&#xff0c;方便用户创建和编辑格式丰富的文本内容 目前在市面上有着很多富文本编辑器组件&#x…

chatgpt赋能Python-30_days_of_python

用20行Python写的入门级小游戏:“猜数字”游戏 如果你想了解Python编程语言并开始使用它&#xff0c;那么编写一个短小精简的小游戏是一个不错的起点。在这篇文章中&#xff0c;我们将介绍一个入门级小游戏&#xff1a;猜数字游戏。 该游戏旨在帮助你了解Python命令行输入输出…

QRegion 限制 QPainter 的绘制区域

我有这样一个需求。 有一张图片&#xff0c;这张图片上面被我用不同的颜色画了不同的区域&#xff0c;然后我想选择这张图片中的某一种颜色&#xff0c;只在这种颜色所在的区域内进行绘制或者用橡皮擦擦除这种颜色&#xff0c;而不会影响其他颜色。 看着这个需求的时候&#…

Java【网络原理2】TCP 协议的连接管理机制 : 三次握手和四次挥手到底是怎么回事?

文章目录 前言一、三次握手二、四次挥手总结 前言 &#x1f4d5;各位读者好, 我是小陈, 这是我的个人主页 &#x1f4d7;小陈还在持续努力学习编程, 努力通过博客输出所学知识 &#x1f4d8;如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 &#x1f4d9; 希望我的专栏能够…

让AI来预测一下2023年软考系统分析师案例分析的新技术考点

预测 AI对考试的帮助可能没法雪中送炭&#xff0c;但是也许可以锦上添花。AI的预测新技术考点内容&#xff08;仅供参考&#xff09;如下&#xff1a; 由于我是一个AI模型&#xff0c;无法准确预测未来的技术内容。但是根据当前的发展趋势和历史变化&#xff0c;以下是可能出…

将核心交换机配置为NTP服务器

AR配置外源NTP 1&#xff0e;配置ntp <XQ-R1220>sys [XQ-R1220]ntp-service unicast-server 120.25.115.20 #阿里云ntp [XQ-R1220]ntp-service unicast-server 203.107.6.88 #阿里云ntp 2&#xff0e;查看ntp状态 <XQ-R1220>display ntp status clock sta…

什么是以太坊Layer2?

目录 1. Plasma2. State Channels3. Sidechains4. Rollups5. Optimistic Rollups 以太坊&#xff08;Ethereum&#xff09;是一种基于区块链技术的分布式计算平台&#xff0c;提供了智能合约的支持&#xff0c;使得开发者可以构建基于以太坊的去中心化应用&#xff08;DApps&am…

什么是【网络安全】?给你一步到位了解清楚

网络安全是什么&#xff1f; 在俺的私信里经常有人问&#xff1a; 网络安全技术是否就等同于”黑客”技术&#xff1f; 大漏特漏&#xff01;&#xff01;&#xff01; 所谓的「黑客」或「渗透」技术&#xff0c;仅仅是网络安全领域的分支&#xff0c;不能代表其全貌。 随着…