MyBatis 缓存机制

news2024/11/27 18:25:06

文章目录

    • 一、一级缓存
    • 二、二级缓存
      • 1.cache 元素
      • 2.缓存命中率

一、一级缓存

MyBatis 的一级缓存是 SqlSession 级别的缓存。如果同一个 SqlSession 对象多次执行完全相同的 SQL 语句,在第一次执行完成后,MyBatis 会将查询结果写入一级缓存中,此后,如果程序没有执行插入、更新和删除操作,当第二次再执行相同的查询语句时,MyBatis 会直接读取一级缓存中的数据,而不用再去数据库查询,从而提高了数据库的查询效率。

在这里插入图片描述

那么我们怎么知道第二次它没有操作数据库呢?
可以通过日志组件来查看一级缓存的工作状态,因此第一步需要在 pom.xml 中引入日志依赖。

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

第二步在 resources 目录下创建 log4j.properties 文件,注意文件名必须只能是 log4j.properties。

#全局日志配置
log4j.rootLogger=DEBUG,Console
#控制台输出配置
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#日志输出级别,只展示了一个
log4j.logger.java.sql.PreparedStatement=DEBUG

增删改会导致一级缓存的清空!

二、二级缓存

相同的 Mapper 类,相同的 SQL 语句,如果 SqlSession 不同,则两个 SqlSession 查询数据库时,会查询数据库两次,这样也会降低数据库的查询效率。为了解决这个问题,就需要用到 MyBatis 的二级缓存。MyBatis 的二级缓存是 Mapper 级别的缓存,与一级缓存相比,二级缓存的范围更大,多个 SqlSession 可以共用二级缓存,并且二级缓存可以自定义缓存资源。
在 MyBatis 中,一个 Mapper.xml 文件通常称为一个 Mapper,MyBatis 以 namespace 区分 Mapper,如果多个 SqlSession 对象使用同一个 Mapper 的相同查询语句去操作数据库,在第一个 SqlSession 对象执行完后,MyBatis 会将查询结果写入二级缓存,此后,如果程序没有执行插入、更新、删除操作,当第二个 SqlSession 对象执行相同的查询语句时,MyBatis 会直接读取二级缓存中的数据。

在这里插入图片描述
同样,增删改查操作会清空二级缓存!

1.cache 元素

与 MyBatis 的一级缓存不同的是,MyBatis 的二级缓存需要手动开启,开启二级缓存通常要完成以下两个步骤:
① 在 MyBatis 的核心配置文件 MybatisConfig.xml 文件中通过 settings 元素开启二级缓存的全局配置;

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

② 开启当前 Mapper 的 namespace 下的二级缓存,可以通过 MyBatis 映射文件中的 cache 元素来完成。

<!-- 开启当前Mapper的namespace下的二级缓存 -->
<cache>
</cache>

默认状态下的二级缓存可实现的功能:
① 映射文件中所有的 select 语句将会被缓存;
② 映射文件中的所有 insert、update 和 delete 语句都会刷新缓存;
③ 缓存会使用 LRU 算法回收;
④ 没有刷新间隔,缓存不会以任何时间顺序来刷新;
⑤ 缓存会存储列表集合或对象的1024个引用;
⑥ 缓存是可读/可写的缓存,这意味着对象检索不是共享的,缓存可以安全的被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

以上是二级缓存在默认状态下的特性,如果需要调整上述特性,可以通过 cache 元素的属性来实现。

在这里插入图片描述

其中,eviction 属性有四个可选值:
① LRU,最近最少使用的策略,移除最长时间不被使用的对象;
② FIFO,先进先出策略,按对象进入缓存的顺序来移除它们;
③ SOFT,软引用策略,移除基于垃圾回收器状态和软引用规则的对象;
④ WEAK,弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象。

在第一次查询结束时释放 SqlSession,将数据写入二级缓存,session1.close()!

2.缓存命中率

终端用户访问存储时,如果在缓存中查找到了要被访问的数据,就叫做命中。当多次执行查询操作时,缓存命中次数与总的查询次数(缓存命中次数+缓存没有命中次数)的比,就叫做缓存命中率,即缓存命中率=缓存命中次数/总的查询次数。当 MyBatis 开启二级缓存后,第一次查询数据时,由于数据还没有进入缓存,所以需要在数据库中查询而不是在缓存中查询,此时缓存命中率为0,第一次查询过后,MyBatis 会将查询到的数据写入缓存中,当第二次再查询相同的数据时,MyBatis会直接从缓存中获取这条数据,缓存将命中,此时的缓存命中率为0.5,当第三次查询相同的数据,则缓存命中率为0.6666,以此类推。

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

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

相关文章

mysql中的binlog用法

binlog是什么 MySQL的二进制日志binlog可以说是MySQL最重要的日志&#xff0c;它记录了所有的DDL和DML语句&#xff08;除了数据查询语句select&#xff09;,以事件形式记录&#xff0c;还包含语句所执行的消耗的时间&#xff0c;MySQL的二进制日志是事务安全型的。使用mysqlb…

Kotlin语法学习(四)_空指针检查

空指针检查 空指针异常是一种不受编程语言检查的运行时异常,只能由程序员主动通过逻辑判断来避免,所以空指针异常往往比较容易出这个问题 可空类型系统 在Kotlin当中利用了编译时判空检查的机制几乎杜绝了空指针异常,Kotlin提供了一些列的工具,让我们能够轻松处理各种判空情…

Verilog 随机数及概率分布

随机数 Verilog 中使用系统任务 $random(seed) 产生随机数&#xff0c;seed 为随机数种子。seed 值不同&#xff0c;产生的随机数也不同。如果 seed 相同&#xff0c;产生的随机数也是一样的。可以为 seed 赋初值&#xff0c;也可以忽略 seed 选项&#xff0c;seed 默认初始值为…

130. 被围绕的区域

130. 被围绕的区域 给你一个 m∗nm * nm∗n 的矩阵 board &#xff0c;由若干字符 ‘X’ 和 ‘O’ &#xff0c;找到所有被 ‘X’ 围绕的区域&#xff0c;并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 实例1&#xff1a; 输入&#xff1a;board [[“X”,“X”,“X”,“X”],…

内容云筑底,火山引擎能否为企业添一把火?

在App里面再搭一个“今日头条”&#xff0c;让用户在自家的App里看图文、刷视频&#xff0c;这是很多企业都想干的一件事情。尤其是对于用户使用频率低的App而言&#xff0c;他们更需要依靠信息流内容加长用户停留时间&#xff0c;增加用户互动次数&#xff0c;进而留住用户&am…

神经网络和深度学习-梯度下降Gradient Descent

梯度下降 损失函数 绝大多数的机器学习模型都会有一个损失函数。比如常见的均方误差&#xff08;Mean Squared Error)损失函数&#xff1a; L(w,b)1N∑i1N(yi−f(wxib))2L(w, b)\frac{1}{N} \sum_{i1}^{N}\left(y_{i}-f\left(w x_{i}b\right)\right)^{2} L(w,b)N1​i1∑N​(y…

物理层物理层

该层解决具体比特传输问题 一般的数据通信系统如图&#xff1a; 该系统可按通信方式分为两种&#xff1a;同步/异步通信和模拟/数字通信&#xff1a; 异步通信是通信双方各自时钟独立&#xff0c;每次只传输一个字符&#xff0c;时钟在传送开始时对齐&#xff1b;这种机制简单…

[附源码]计算机毕业设计JAVA驾校管理系统

[附源码]计算机毕业设计JAVA驾校管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

Docker(四):Docker可视化管理工具

背景 在技术这一行&#xff0c;学无止境&#xff0c;无数的知识点在大脑里面堆积着。各种命令行脚本&#xff08;Python,Java,Nodejs,Linux,Docker&#xff09;数不胜数&#xff0c;如果有视图化的管理工具&#xff0c;帮我们管理着这些命令行脚本&#xff0c;岂不美哉。可以节…

11.22Spring 学习day02

1. 1.1 XML和注解的区别 xml优点&#xff1a; 把标签配置和java代码解耦一目了然&#xff0c;对于业务量大的需求&#xff0c;可以清晰表明各个对象的关系 缺点&#xff1a; 配置不方便&#xff0c;读取和解析需要一定的时间无法及时校验正确性 注解优点&#xff1a; 配置…

返乡人员信息登记管理系统,助力精准管控

随着全国疫情的零星化&#xff0c;再加上元旦与春节很快就要来临了。这几个月各省的人员流动性肯定会逐渐增加&#xff0c;为了应对佳节的人流高峰期&#xff0c;不少省市都早已发出通知。要求返乡人员提前3天提前报备行程&#xff0c;从而便于极大地提高了登记效率&#xff0c…

数字集成电路设计(五、仿真验证与 Testbench 编写)(四)

文章目录7. 用户自定义元件模型7.1 UDP应用实例8. 基本门级元件和模块的延时建模8.1 门级延迟建模8.1.1 门级延迟的基本延迟表达形式8.1.2 门级延迟的最小、典型、最大延迟表达形式8.1.3 例子用VerilogHDL建立图5.8-1 模块D的延迟仿真模块8.2 模块延迟建模8.2.1 延迟说明块 Spe…

数据分析和可视化必备的几大软件,你用过几个?

本文主要是面向数据分析初学者&#xff0c;因此分享的基本是一些免编程的可视化工具&#xff0c;详细介绍了7款工具&#xff0c;推荐大家使用&#xff0c;主要是让初学数据分析的朋友知道可视化工具大概有哪些、流行的有哪些。 Power BI Power BI是微软开发的商业分析工具。用户…

LeetCode 91 双周赛

2465. 不同的平均值数目 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组&#xff0c;你就重复执行以下步骤&#xff1a; 找到 nums 中的最小值&#xff0c;并删除它。找到 nums 中的最大值&#xff0c;并删除它。计算删除两数的平均值。 两数…

mysql InnooDb存储引擎的体系结构和逻辑存储结构

前言 这是一篇理论性比较强的文章&#xff0c;是不是很多人一听理论性的东西&#xff0c;就被劝退了&#xff1f;可千万别。其实分享内容非常简单&#xff0c;也非常干&#xff0c;相信你会喜欢的&#xff0c;对你也是有帮助的。切入正题&#xff0c;mysql的体系结构可以作为一…

机理类模型的建模思路|2021年亚太赛B题|2022备赛|前景目标提取

目录 一、 前景目标提取问题 1.背景目标和前景目标提取 2.问题一 2.2问题一求解 3.问题二 4.问题三 5.问题四 6.问题五​ 7.问题六 8.矩阵范数 二、前景目标提取——机理总结 三、编程实现 一、 前景目标提取问题 1.背景目标和前景目标提取 不动 & 动 视…

redis集群

Redis集群在保证主从加哨兵的基本功能之外&#xff0c;还能够提升Redis存储数据的能力。 一致性hash环 k1-->crc(16)? 0-16384 redis集群的ping-pang机制&#xff1a;一个主机向另一个主机ping&#xff0c;另一个pang回来&#xff0c;说明连接成功&#xff0c;通过这样的方…

脑与认知科学基础(期末复习)

脑与认知科学基础&#xff08;期末复习&#xff09; 文章目录脑与认知科学基础&#xff08;期末复习&#xff09;第一章 脑与认知科学简介认知元认知中国脑计划第二章 大脑简介Human brain解剖参考坐标大脑皮质脑的内侧和腹侧面神经系统神经系统的细胞神经元间信号传导神经回路…

【LeetCode】No.94. Binary Tree Inorder Traversal -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/binary-tree-inorder-traversal/ 1. 题目介绍&#xff08;Binary Tree Inorder Traversal&#xff09; Given the root of a binary tree, return the inorder traversal of its nodes’ values. 【Translate】&#xff1a…

Trie字典树详解

字典树&#x1f4d6;1. 什么是Trie树&#x1f4d6;2. Trie树的一些应用场景&#x1f4d6;3. Trie树的优缺点&#x1f4d6;4. Trie树的节点怎样定义&#x1f4d6;5. 代码实现&#x1f4d6;6. 字典树的优化&#x1f4d6;1. 什么是Trie树 Trie树&#xff0c;又叫字典树&#xff0…