Mybatis 里面的缓存机制

    Mybatis 里面设计的二级缓存是用来提升数据的检索效率,避免每次数据的访问都需要去查询数据库。

     一级缓存,是 SqlSession 级别的缓存,也叫本地缓存,因为每个用户在执行查询的时 候都需要使用 SqlSession 来执行, 为了避免每次都去查数据库,Mybatis 把查询出来的数据保存到 SqlSession 的本地缓 存中,后续的 SQL 如果命中缓存,就可以直接从本地缓存读取了。 

    如果想要实现跨 SqlSession 级别的缓存?那么一级缓存就无法实现了,因此在 Mybatis 里面引入了二级缓存,就是当多个用户在查询数据的时候,只要有任何一个 SqlSession 拿到了数据就会放入到二级缓存里面, 其他的 SqlSession 就可以从二级缓存加载数据。 

        每个 一级缓存的具体实现原理是: 在 SqlSession 里面持有一个 Executor,每个 Executor 中有一个 LocalCache 对象。 当用户发起查询的时候,Mybatis 会根据执行语句在 Local Cache 里面查询,如果没命中,再去查询数据库并写入到 LocalCache,否则直接返回。 所以,缓存的生命周期是 SqlSessiion,而且在多个 Sqlsession 或者分布式环境下, 可能会导致数据库写操作出现脏数据。 

        

    (如图)二级缓存的具体实现原理是: 使用 CachingExecutor 装饰了 Executor,所以在进入一级缓存的查询流程之前,会先通过 CachingExecutor 进行二级缓存的查询。 

        开启二级缓存以后,会被多个 SqlSession 共享,所以它是一个全局缓存。因此它的查询流程是先查二级缓存,再查一级缓存,最后再查数据库。 

        另外,MyBatis 的二级缓存相对于一级缓存来说,实现了 SqlSession 之间缓存数据 的共享,同时缓存粒度也能够到 namespace 级别,并且还可以通过 Cache 接口实现类不同的组合,对 Cache 的可控性也更强。 

        二级缓存的设计思想非常常见,比如 Nacos、Eureka 都用到了。

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

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

相关文章

CSAPP的Lab学习——BombLab

文章目录 前言一、一号炸弹(小试牛刀)二、二号炸弹(六重循环)三、三号炸弹(不同输入,不同答案)四、四号炸弹(判断语句的实现)五、五号炸弹(跳转,循…

selenium可以编写自动化测试脚本吗?

Selenium可以用于编写自动化测试脚本,它提供了许多工具和API,可以与浏览器交互,模拟用户操作,检查网页的各个方面。下面是一些步骤,可以帮助你编写Selenium自动化测试脚本。 1、安装Selenium库和浏览器驱动程序 首先…

云服务器利用Docker搭建sqli-labs靶场环境

一、安装宝塔面板 使用xshell、electerm、SecureCRT等远程终端连接登陆上云服务器,在Linux宝塔面板使用脚本安装 安装后,如下图:按照提示,在云服务器防火墙/安全组放行Linux宝塔面板的端口 在浏览器打开上述网址,登…

“媒体+”时代正当时,ATEN以前瞻解决方案助推媒体融合纵深发展

自媒体融合概念提出以来,传统媒体与新媒体融合速度加快,两者的相互结合与优势互补为广电行业发展提供了新的契机,更加多元化、个性化、强互动的“媒体”传播格局已逐渐形成。 “媒体”理念的创建,对于广电行业而言无疑是一种积极的改革创新之举,然而“媒体”的发展也呈现出泛媒…

“Linux vs. Windows: 一些你可能不知道的区别“

文章目录 每日一句正能量前言分享一些在Linux上顺理成章,换到Windows上就可能令人费解的事介绍或分享一些Linux的使用技巧介绍或分享一些Windows的使用技巧后记 每日一句正能量 世界上最暖心的一句话,不是你在成功时多热切地喝彩,而是在失意时…

大数据项目实战(完整的搭建大数据集群环境)

一,搭建大数据集群环境 (由于内容过多分为了4个博客,后面有链接分享,也可去我的主页查看) 1.1安装准备 1.1.1虚拟机安装与克隆 1.虚拟机的安装和设置以及启动虚拟机并安装操作系统 安装一台虚拟机主机名为&#x…

无涯教程-Android - AutoCompleteTextView函数

AutoCompleteTextView是一个类似于EditText的视图,只是它在用户键入时自动显示补充数据。 AutoCompleteTextView - 属性 以下是与AutoCompleteTextView控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关方法。…

开源文库系统moredoc

什么是 moredoc ? moredoc 中文名 魔豆文库,是基于 golang 开发的类似百度文库、新浪爱问文库的开源文库系统,支持 TXT、PDF、EPUB、MOBI、Office 等格式文档的在线预览与管理,为 dochub 文库(github, gitee )的重构版…

数据结构(Java实现)-优先级队列(堆)

队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队 列在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。 这种数据结构就…

设计模式大白话——命令模式

命令模式 一、概述二、经典举例三、代码示例(Go)四、总结 一、概述 ​ 顾名思义,命令模式其实和现实生活中直接下命令的动作类似,怎么理解这个命令是理解命令模式的关键!!!直接说结论是很不负责…

【办公类-16-01-02】2023年度上学期“机动班下午代班的排班表——跳过周三、节日和周末”(python 排班表系列)

背景需求: 2023年第一学期(2023年9-2024年1月),我又被安排为“机动班”,根据新学期的校历,手动推算本学期的机动班的带班表 排版原则 1、班级数量:共有6个班级,循环滚动 2、每周次…

Unity实现倒计时和获取系统时间

一:创建UGUI 1.创建Canvas画布组件,调节Canvas画布的分辨率等其他设置。我们可以把视图设置为2D模式下。 2.创建Text文本组件,取名为Timer计时器,我们调整Text文本组件的大小,用锚点设置Text文本组件的位置,并且设置好Text文本组件的颜色。 3.我们再创建一个Text文…