MyBatis:缓存机制详解

news2024/12/26 11:21:38

本篇内容包括:MyBatis 缓存机制概述、一级缓存与二级缓存的介绍、配置和具体流程。

一、MyBatis 缓存机制概述

在我们常见的 OLTP(on-line transaction processing,联机事务处理)类型的 Web 应用中,性能的瓶颈往往来源于数据库查询,因为应用服务器层面可以水平扩展,但是数据库是单点的,很难水平扩展,当数据库服务器发生磁盘 IO,往往无法有效提高性能,因此如何有效降低数据库查询频率,减轻数据库磁盘 IO 压力,是 Web 应用性能问题的根源之一。

对象缓存是所有缓存技术当中适用场景最广泛的,即使在实时性要求很高的 OLTP 应用中,我们依旧可以使用,而且好的 ORM 实现,对象缓存是完全透明的,完全不需要程序代码进行硬编码。

Mybatis 作为目前流行的 ORM 持久层框架,与其他 ORM 框架一样,也提供了缓存机制,用以提高查询的效率、减少数据库压力。在日常工作中,开发人员多数情况下是使用 MyBatis 的默认缓存配置就已经足够了,但是 Mybatis 的缓存机制并不完美,本身还存在着很多问题,还需要我们深入了解其内在机制原理才行。

Mybatis 的缓存分为两级:一级缓存、二级缓存。一级缓存被称为 Sqlssion 级别的缓存,缓存的数据只在 SqlSession 内有效;二级缓存被称为表(mapper)级缓存,同一个 namespace 公用这一个缓存,所以对 SqlSession 是共享的。


二、一级缓存和二级缓存

1、一级缓存

MyBatis 的一级缓存是 SqlSession 级别的缓存,在操作数据库的时候需要先创建 SqlSession 会话对象,在对象中有一个 HashMap 用于存储缓存数据,此 HashMap 是当前会话对象私有的,别的 SqlSession 会话对象无法访问。

具体流程:

  • 第一次执行 select 完毕会将查到的数据写入 SqlSession 内的 HashMap 中缓存起来
  • 第二次执行 select 会从缓存中查数据,如果 select 相同切传参数一样,那么就能从缓存中返回数据,不用去数据库了,从而提高了效率。

注意事项:

  1. 如果 SqlSession 执行了 DML 操作(insert、update、delete),并 commit 了,那么 mybatis 就会清空当前 SqlSession 缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现脏读 ;
  2. 当一个 SqlSession 结束后那么他里面的一级缓存也就不存在了,Mybatis 默认是开启一级缓存,不需要配置;
  3. MyBatis 的缓存是基于 [namespace:sql语句:参数] 来进行缓存的,意思就是,SqlSession 的 HashMap 存储缓存数据时,是使用 [namespace:sql:参数] 作为 key,查询返回的语句作为 value 保存的。

2、二级缓存

二级缓存是 mapper 级别的缓存,也就是同一个 namespace 的 mappe.xml,当多个 SqlSession 使用同一个 Mapper 操作数据库的时候,得到的数据会缓存在同一个二级缓存区域二级缓存默认是没有开启的。需要在 setting 全局参数中配置开启二级缓存。

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

还需要在 Mapper 的xml 配置文件中加入 <cache> 标签

在需要使⽤⼆级缓存的 Mapper 配置⽂件中设置 cache 标签:

<!--开启二级缓存-->
<cache></cache>

cache 标签的一些属性:

  • – eviction 属性:缓存回收策略(默认的是 LRU)
  • – LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。
  • – FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。
  • – SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
  • – WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
  • – flushInterval 属性:刷新间隔,单位毫秒,默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新
  • – size 属性:引用数目,正整数,代表缓存最多可以存储多少个对象,太大容易导致内存溢出
  • – readOnly 属性:只读,true/false
  • – true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。
  • – false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。

如果我们是基于注解形式进行查询,可以在 mapper 查询接口上添加 @CacheNamespace 注解开启二级缓存,后面可以带参数指定加载自定义的缓存实现类:

//开启二级缓存
@CacheNamespace(implementation = RedisCache.class)

具体流程:

  1. 当一个 Sqlseesion 执行了一次 select 后,在关闭此 session 的时候,会将查询结果缓存到二级缓存;
  2. 当另一个 Sqlsession 执行 select 时,首先会在他自己的一级缓存中找,如果没找到,就回去二级缓存中找,找到了就返回,就不用去数据库了,从而减少了数据库压力提高了性能

注意事项:

  1. 如果 SqlSession 执行了 DML 操作(insert、update、delete),并 commit 了,那么 Mybatis 就会清空当前 mapper 缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现脏读
  2. MyBatis 的缓存是基于 [namespace:sql语句:参数] 来进行缓存的(一二级缓存命名相同),意思就是,SqlSession 的 HashMap 存储缓存数据时,是使用 [namespace:sql:参数] 作为 key,查询返回的语句作为 value 保存的。

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

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

相关文章

【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

目录前言一、注意力机制&#xff1a;Attention二、自注意力机制&#xff1a;Self-Attention三、多头注意力机制&#xff1a;Multi-Head Self-Attention四、位置编码&#xff1a;Positional EncodingReference前言 最近在学DETR&#xff0c;看源码的时候&#xff0c;发现自己对…

【码上掘金编程挑战赛】- 前端可冲【简历加分项】

【码上掘金编程挑战赛】1.比赛报名2. 比赛介绍赛题一&#xff1a;码上游戏赛题二&#xff1a;码上创意赛题三&#xff1a;码上文言文赛题四&#xff1a;码上10243.报名4.提交作品1.比赛报名 比赛报名链接 https://juejin.cn/challenge/1?utm_source3169 2. 比赛介绍 赛题一…

Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】

Spring5入门到实战------12、使用JdbcTemplate操作数据库&#xff08;增删改查&#xff09;。具体代码讲解 【上篇】 Spring5入门到实战------13、使用JdbcTemplate操作数据库&#xff08;批量增删改&#xff09;。具体代码讲解 【下篇】 以上两篇采用的是注解开发形式xml配置…

自己动手写操作系统系列第3篇,实现时钟和键盘中断

对应labOS版本1.3 程序源码可以私聊我 picirq.h int 0x20~0x2f接收中断信号IRQ0~15&#xff0c;因为int 0x00~0x1f不能用于IRQ。 picirq.c pic0_mask0xfb即1111 1011&#xff1b;PIC1以外全部禁止。pic1_mask0xff即1111 1111&#xff1b;禁止所有中断 pic_enable函数就是将…

【Linux下安装jdk】Linux下安装jdk

Linux下安装jdk 1、-RPM安装 1.1、检查系统是否安装过jdk java -version 检查是否有安装包 rpm -qa | grep java 1.2、安装jdk 查看服务器版本: uname -a 下载jdk对应rpm包: https://www.oracle.com/java/technologies/downloads/#java8 上传安装包至任意目录下&…

用户登录权限校验 JWT【详解】

JWT &#xff08;json web token&#xff09;是当前最流行的用户登录权限校验&#xff08;用户认证鉴权&#xff09;方案。 官网 https://jwt.io/ JWT 的工作流程 客户端填写账号密码访问登录接口 login&#xff0c;将账号密码传给服务端服务端验证账号密码是否正确&#xff0c…

职言 | 校招面试有感,一个面试官的几点建议

职言&#xff1a; 最近一直在校招&#xff0c;我&#xff08;作者&#xff09;和同事说等这段时间结束&#xff0c;我不想再参与面试了&#xff0c;快面吐了。从校招开始&#xff0c;我团队前前后后陆续进了500多封学生简历&#xff0c;我经常一整天排满了面试&#xff0c;聊到…

【电子通识】芯片资料(数据手册/规格书)查询常用网站和方法

目录 1.AlldataSheet 网站&#xff08;建议使用&#xff09; 2.ICpdf 网站 3.CIC中国IC网 网站 4.datasheet&#xff08;不建议使用&#xff09; 5.半导小芯 &#xff08;建议使用&#xff09; 6.立创商城 &#xff08;建议使用&#xff09; 在做硬件的芯片选型、产品维修…

生物信息学笔记02 -- 研究的一般方法

生物信息学概述 以基因组DNA序列信息为源头&#xff0c;识别基因组序列中代表蛋白质和RNA基因的编码区&#xff0c;阐明非编码区的信息特征&#xff0c;破译隐藏在DNA序列中的遗传语言规律 生物信息学研究的内容与方法 研究主要内容 ⚫ 生物学数据的收集、存储、管理与提供 …

C++:继承

文章目录前言一、继承的概念及定义1.继承的概念2.继承的定义二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员总结前言 本文介绍C中的继承。 一、继承的概念及定义 1.继承的概念 继承机制是面向对象程序设计使代码可…

厨电智能化趋势下,究竟什么才是真正的“用户思维”?

文|智能相对论 作者|佘凯文 近期2022年前三季度的各项经济数据在陆续发布&#xff0c;大环境依然承压&#xff0c;各个行业都在负重前行。 厨电行业在房地产下滑、疫情反复等因素影响下&#xff0c;前三季度同样一直承受着不小的压力&#xff0c;AVC数据显示&#xff0c;202…

【面试官说实现一个顺序表,但听到要求后我沉默了】

在很多人心里&#xff0c;顺序表是数据结构最基础最简单的东西了&#xff0c;如果面试让我们手撕一道顺序表&#xff0c;相信大家心里早就乐开了花&#xff0c;但是面试官真的会出这么简单的题吗&#xff1f; 答案是&#xff1a;当然会&#xff0c;哈哈。 我们来看看面试官的要…

【精选】ARMv8/ARMv9架构入门到精通-[前言]

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 想不想一夜暴富&#xf…

python基于PHP+MySQL的高校公选课管理信息系统

随着我国教育质量提高,在校大学生的数量也在不断的增长。相对应的如何让学生根据自己的兴趣爱好进行在线选课,从而有目的的对学生进行培养,也是当前很多高校教务人员所关心的问题。能够让更多的大学生进行在线自主选课,选择自己所喜欢的课程和教师,我们开发了高校公选课管理系统…

强化学习论文分析3---蜂窝网络联合频谱和功率分配的深度强化学习--《Deep Reinforcement Learning for ......》

目录一、研究内容概述二、系统目标与约束1.系统描述2.系统目标三、DQN、DDPG网络设计四、性能表征本文是对论文《Deep Reinforcement Learning for Joint Spectrum and Power Allocation in Cellular Networks》的分析&#xff0c;若需下载原文请依据前方标题搜索&#xff0c;第…

深入理解java线程池+源码解读

文章目录一.线程池简介1. 什么是线程池2. 线程池的优点3. 线程池中核心关系继承4.对线程池的理解①框架的两极调度模型②核心线程和非核心线程的本质区别二. 线程池核心概念1. 线程池核心参数2.两种常见的线程池①newCachedThreadPool②newFixedThreadPool③newSingleThreadExc…

基于STM32F469 discovery kit 开发板的开发3

目录基于STM32F469 discovery kit 开发板的开发3软件项目架构1. 应用层&#xff1a;2. Drivers层3. Middlewares层软件工作流程main函数入口LED等初始化配置外部中断基于STM32F469 discovery kit 开发板的开发3 前文我们已经实现了第一个例程在discovery 开发板上的运行&#…

virtio机制简介

What is VirtIO VirtIO是virtual input & output的缩写&#xff0c;是在host device之上的一层抽象层&#xff0c;提供给虚拟机使用。VM虚机一般是通过virtio device来使用host devices设备的&#xff0c;所以一个VirtIO device的主要作用其实就是充当VM与host device har…

Arduino UNO 可视化GT-24工业级无线透传

Arduino UNO 可视化GT-24工业级无线透传一、前言二、硬件要求三、参数基础四、原理剖析五、透传思路六、程序概要七、arduino使用接线八、成果展示一、前言 无线透传市面上较为常见的是基于蓝牙、esp的多种透传模块&#xff0c;今天介绍的则是用NRF24L01芯片构成的电路。&…

RocketMQ5.0 Broker主备自动切换模式消息不丢失部署方案

RocketMQ5.0主备自动切换模式下消息的不丢失方案如何进行部署&#xff1f;下面就来看一下 1. 下载RocketMQ5.0 首先我们去官网将RocketMQ5.0的版本下载下来。 $ wget https://dlcdn.apache.org/rocketmq/5.0.0/rocketmq-all-5.0.0-bin-release.zip 复制代码 下载完成后解压到…