Mybatis缓存

:::Mybatis缓存
💡 根据 遗忘曲线:如果没有记录和回顾,6天后便会忘记75%的内容
读书笔记正是帮助你记录和回顾的工具,不必拘泥于形式,其核心是:记录、翻看、思考
:::

书名MyBatis缓存机制
作者蒂芬崽·莫
状态已读完
简介MyBatis将数据缓存设计成两级结构,分为一级缓存、二级缓存

思维导图

mybatis缓存思维导图

缓存

概念

一级缓存是指 SqlSession 级别的缓存,当在同一个 SqlSession 中进行相同的 SQL 语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存 1024 条 SQL。

二级缓存是指可以跨 SqlSession 的缓存。是 mapper 级别的缓存,对于 mapper 级别的缓存不同的 sqlsession 是可以共享的。

image.png

一级缓存(sqlSession级别)

第一次发出一个查询 sql,sql 查询结果写入 sqlsession 的一级缓存中,缓存使用的数据结构是一个 map。

{
key:MapperID+offset+limit+Sql+所有的入参

value:用户信息
}

同一个 sqlsession 再次发出相同的 sql,就从缓存中取出数据。如果两次中间出现 commit 操作(修改、添加、删除),本 sqlsession 中的 一级缓存区域全部清空,下次再去缓存中查询不到所以要从数据库查询,从数据库查询到再写入缓存

二级缓存(mapper级别)

二级缓存的范围是mapper 级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是 map。
mybatis 的二级缓存是通过 CacheExecutor 实现的。CacheExecutor 其实是 Executor 的代理对象。
所有的查询操作,在 CacheExecutor 中都会先匹配 缓存中是否存在,不存在则查询数据库。

key:MapperID+offset+limit+Sql+所有的入参

具体使用需要配置:

  1. Mybatis 全局配置中启用二级缓存配置
  2. 在对应的 Mapper.xml 中配置 cache 节点
  3. 在对应的 select 查询节点中添加 useCache=true

二级缓存工作原理

一级缓存是Session会话级别的,一般而言,一个SqlSession对象会使用一个Executor对象来完成会话操作,Executor对象 会维护一个Cache缓存,以提高查询性能。

如上所言,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个 Executor对象做文章。

如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。
image.png
CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接 返回缓存结果;

如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的 查询结果放置到缓存中,然后在返回给用户。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp设置手机通知权限以及uniapp-push2.0推送

unipush2.0代码 export default function () {// 调用获取用户通知权限setPermissions()// 获取客户端唯一的推送标识,可用于测试uni.getPushClientId({success: (res) > {console.log(res.cid)},fail(err) {console.log(err)}})// 监听推送uni.onPushMessage(r…

珠海市第四届职业技能大赛成功举办,开源网安提供全程技术支持

​近日,由珠海市人社局、珠海市总工会、珠海市教育局、珠海市高新区管委会联合主办的【珠海市第四届职业技能大赛暨第二届“行行出状元”大赛-软件技术竞赛项目】落下帷幕,三位优秀参赛选手脱颖而出,荣获珠海市人社局授予的“珠海市技术能手”…

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)

文章目录 1.实现目标2.实现过程2.1 数据与预处理2.2 GeoJson解析2.3 Mesh构建与属性存储2.4 核心代码2.5 材质2.6 蓝图应用测试3.参考资料1.实现目标 在之前的文章中,基于GeoJson数据加载,实现了绘制单面功能,但只支持单个要素Feature。本文这里实现对Geojson内所有面要素的…

css新闻链接案例

利用html和css构建出新闻链接案例,使用渐变色做出背景色变化 background: linear-gradient(to bottom, rgb(137, 210, 251), rgb(238, 248, 254), white); 利用背景图片,调整位置完成 dd { height: 28px; line-height: 28px; background-image: url(./图…

【Vulnhub 靶场】【Prime (2021): 2】【简单 - 中等】【20210509】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/prime-2021-2,696/ 靶场下载:https://download.vulnhub.com/prime-2021/Prime-2.ova 靶场难度:简单 - 中等 发布日期:2021年5月9日 文件大小:3.7 GB 靶场作者&am…

软件平台架构设计与技术管理之道笔记

软件平台架构设计与技术管理之道笔记 认知 领导软件平台各方面的工作,对技术底蕴、思维模式、决策能力、工作风格、文化铸造等方面都有极高的要求,可以称之为“领域智慧”。认知盲区的代价是巨大的,“不知”比“不会”的后果更严重&#xf…

Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理

文章目录 Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理结论1 java异常体系2 Spring框架异常处理3 定位Spring框架转化为哪种unchecked异常3.1 捕获RuntimeException定位Spring框架转化抛出的异常类3.2 进一步查看包名判断3.3 识别MyBatisSystemException下级实现3.3 识别My…

云原生之深入解析如何限制Kubernetes集群中文件描述符与线程数量

一、背景 linux 中为了防止进程恶意使用资源,系统使用 ulimit 来限制进程的资源使用情况(包括文件描述符,线程数,内存大小等)。同样地在容器化场景中,需要限制其系统资源的使用量。ulimit: docker 默认支持…

零信任组件和实施

零信任是一种安全标准,其功能遵循“从不信任,始终验证”的原则,并确保没有用户或设备受信任,无论他们是在组织网络内部还是外部。简而言之,零信任模型消除了信任组织安全边界内任何内容的概念,而是倡导严格…

软件崩溃时VS中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈 3、将Windbg中显示的函数调用堆栈对照着C源码进一步分析 4、最后 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/art…

考研失利后,我是如何零基础转行测试开发 ,成功拿下独角兽公司offer?

想当年,从一个什么都不懂的非科班测试小白,考研失利后,转行到K12教育知名互联网公司做测试开发工程师,我用了大概半年的时间。 这个过程中我自己也摸索出了一条学习路线,在这里想给大家分享一下我的学习路线&#xff…

Linux中项目部署步骤

安装jdk,tomcat 安装步骤 1,将压缩包,拷贝到虚拟机中。 通过工具,将文件直接拖到虚拟机的/home下 2,回到虚拟机中,查看/home下,有两个压缩文件 3,给压缩文件做解压缩操作 tar -z…

夯实c基础

夯实c基础 区别: 图一的交换,(交换的是地址而不是两数)无法实现两数的交换。 题干以下程序的输出结果为( c  )。 void fun(int a, int b, int c){ ca*b; } void main( ){ int…

揭秘MQTT:为何它是物联网的首选协议?

文章目录 MQTT 协议简介概览MQTT 与其他协议对比MQTT vs HTTPMQTT vs XMPP 为什么 MQTT 是适用于物联网的最佳协议?轻量高效,节省带宽可靠的消息传递海量连接支持安全的双向通信在线状态感知 MQTT 5.0 与 3.1.1MQTT 服务器MQTT 客户端 MQTT 协议简介 概…

nodejs_vue+vscode美容理发店会员管理系统un1dm

按照设计开发一个系统的常用流程来描述系统,可以把系统分成分析阶段,设计阶段,实现阶段,测试阶段。所以在编写系统的说明文档时,根据系统所处的阶段来描述系统的内容。 绪论:这是对选题的背景,意…

〖大前端 - 基础入门三大核心之JS篇㊸〗- DOM事件对象的方法

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

凯捷对汽车数字化的思考

标题凯捷(中国)对汽车行业数字化转型的探索 凯捷中国数字化研发团队有超过1200名专业顾问致力于数字化相关项目,分布在北京、天津、沈阳、呼和浩特、上海、昆山、杭州、广州、深圳等地,运用Rightshore交付模式和通过专业顾问为客…

项目实战之RabbitMQ冗余双写架构

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:项…

【数电笔记】11-最小项(逻辑函数的表示方法及其转换)

目录 说明: 逻辑函数的建立 1. 分析逻辑问题,建立逻辑函数的真值表 2. 根据真值表写出逻辑式 3. 画逻辑图 逻辑函数的表示 1. 逻辑表达式的常见表示形式与转换 2. 逻辑函数的标准表达式 (1)最小项的定义 (2&am…

Chrome 拓展开发系列:什么是 Chrome 拓展?

文章目录 Chrome 拓展(Chrome Extension)是什么为什么使用 Chrome 拓展?个性化浏览体验提高工作效率改善隐私和安全创新新功能 发展历史2009 年:初版发布2010 年:稳步增长2013 年:Chrome App 和扩展合并201…