MyBatis(9)MyBatis 的一级缓存和二级缓存的区别

MyBatis 提供了两级缓存机制:一级缓存(Session级别)和二级缓存(全局级别),以提高应用的性能通过减少数据库的查询次数。

一级缓存(Session级别)

一级缓存是基于 SQL 会话(SqlSession)的,它是默认开启的。一级缓存的生命周期与 SQL 会话一致,当会话结束时,缓存也随之消失。这意味着,在同一个 SQL 会话中,对于相同的查询请求,第一次会从数据库中获取数据,并缓存结果;之后相同的查询请求将直接从缓存中获取数据,不会再去访问数据库。

try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class);// 第一次查询,数据来自数据库Blog blog1 = mapper.selectBlogById(1);// 第二次查询,相同的会话中,数据来自一级缓存Blog blog2 = mapper.selectBlogById(1);
}

一级缓存主要是利用了一个 Map 来存储缓存数据,关键代码在 DefaultSqlSession 类中的 selectList 方法里,它使用了 Executorquery 方法来实现。

public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {try {MappedStatement ms = configuration.getMappedStatement(statement);return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);} catch (Exception e) {throw ExceptionFactory.wrapException("Error querying database.  Cause: " + e, e);} finally {ErrorContext.instance().reset();}
}

CachingExecutor 类的 query 方法中实现了一级缓存的逻辑:

public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {BoundSql boundSql = ms.getBoundSql(parameter);CacheKey key = createCacheKey(ms, parameter, rowBounds, boundSql);return query(ms, parameter, rowBounds, resultHandler, key, boundSql);
}

二级缓存(全局级别)

二级缓存是跨 SQL 会话的,它基于 namespace 级别。开启二级缓存后,数据会存储在全局作用域内,这意味着,即使 SQL 会话关闭,缓存数据仍然可用,可以被其他 SQL 会话复用。

要启用二级缓存,需要在 MyBatis 配置文件中添加相应的配置,并在映射文件中明确指定哪些映射器使用二级缓存。

<!-- 在 mybatis-config.xml 中启用全局二级缓存 -->
<configuration><settings><setting name="cacheEnabled" value="true"/></settings>
</configuration>

在映射文件中使用二级缓存:

<!-- 在 Mapper.xml 中开启二级缓存 -->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

二级缓存的关键实现在 CachingExecutor 类:

public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler,CacheKey key, BoundSql boundSql) throws SQLException {Cache cache = ms.getCache();if (cache != null) {flushCacheIfRequired(ms);if (ms.isUseCache() && resultHandler == null) {ensureNoOutParams(ms, boundSql);@SuppressWarnings("unchecked")List<E> list = (List<E>) tcm.getObject(cache, key);if (list == null) {list = delegate.query(ms, parameter, rowBounds, resultHandler, key, boundSql);tcm.putObject(cache, key, list); // issue #578 and #116}return list;}}return delegate.query(ms, parameter, rowBounds, resultHandler, key, boundSql);
}

区别总结

  • 作用范围:一级缓存是基于 SqlSession 的,其生命周期也随之绑定;而二级缓存是基于 Mapper 的 namespace,对整个应用有效。
  • 生命周期:一级缓存随着 SQL 会话的结束而失效,二级缓存则可以跨会话使用。
  • 可自定义性:二级缓存提供了更多的自定义设置,例如失效策略、大小限制等,通过在 Mapper.xml 中配置 <cache> 标签来实现。
  • 数据安全:二级缓存由于是跨会话的,使用时需要更加注意数据的一致性问题。在使用二级缓

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

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

相关文章

优化 C# 和 .NET Core Web API 中的 LINQ 查询

LINQ&#xff08;语言集成查询&#xff09;是 C# 中的一项强大功能&#xff0c;允许开发人员以可读且简洁的方式查询和操作数据。但是&#xff0c;LINQ 的使用效率低下可能会导致性能瓶颈&#xff0c;尤其是在处理 .NET Core Web API 中的大型数据集时。优化 LINQ 查询对于维护…

嵌入式 Linux 设备刷系统具体组成

嵌入式 Linux 设备刷系统具体组成 1 介绍1.1 概述1.2 嵌入式 Linux 的组成1.3 U-Boot1.4 Linux 内核1.5 设备树1.6 根文件系统 参考 1 介绍 1.1 概述 一个完整的 linux 系统&#xff0c;通常包含了 U-Boot、kernel、设备树以及根文件系统。 1.2 嵌入式 Linux 的组成 1.3 U-…

Java热门技术点总结:Lambda表达式与Stream API

第一部分&#xff1a;Lambda表达式 1. 简介 Lambda表达式是Java 8引入的一个非常重要的特性&#xff0c;它提供了一种简洁、灵活的函数式编程方式。Lambda表达式允许我们将函数作为参数传递&#xff0c;极大的简化了代码的编写。 2. 基本语法 Lambda表达式的基本语法如下&a…

教程:Spring Boot中集成Elasticsearch的步骤

教程&#xff1a;Spring Boot中集成Elasticsearch的步骤 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当今大数据时代&#xff0c;搜索功能对于许多应用程…

注解详解系列 - @RestClientTest:Rest客户端测试

注解简介 在今天的注解详解系列中&#xff0c;我们将探讨RestClientTest注解。RestClientTest是Spring Boot提供的一个注解&#xff0c;用于简化Rest客户端的测试。通过RestClientTest注解&#xff0c;可以轻松地对使用RestTemplate或WebClient的代码进行单元测试&#xff0c;…

Java基于jjwt操作jwt

之前讲解了jwt的相关知识&#xff0c;有不了解的&#xff0c;可以查看相关的文章JWT简介-CSDN博客&#xff0c;本节不再介绍&#xff0c;主要讲解有关java中如何通过jjwt库产生jwt以及解析jwt的相关操作。 添加maven依赖 <dependency><groupId>io.jsonwebtoken&l…

sam_out 目标检测的应用

缺点参考地址训练验证模型解析 缺点 词表太大量化才可 参考地址 https://aistudio.baidu.com/projectdetail/8103098 训练验证 import os from glob import glob import cv2 import paddle import faiss from out_yolo_model import GPT as GPT13 import pandas as pd imp…

目标检测之YoloV1

一、预测阶段&#xff08;前向推断&#xff09; 在预测阶段Yolo就相当于一个黑箱子&#xff0c;输入的是448*448*3的图像&#xff0c;输出是7*7*30的张量&#xff0c;包含了所有预测框的坐标、置信度和类别 为什么是7*7*30呢&#xff1f; --将输入图像划分成s*s个grid cell&a…

【多线程】如何解决线程安全问题?

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. synchronized 关键字1.1 锁是什么1.2 如何加锁1.3 synchronized 修饰方法1) 修饰普通成员方法2) 修饰静态…

LeetCode //Bash - 192. Word Frequency

192. Word Frequency Write a bash script to calculate the frequency of each word in a text file words.txt. For simplicity sake, you may assume: words.txt contains only lowercase characters and space ’ ’ characters.Each word must consist of lowercase ch…

【系统架构设计师】七、信息安全技术基础知识(访问控制技术|抗攻击技术|计算机系统安全保护能力等级)

目录 一、访问控制技术 二、信息安全的抗攻击技术 2.1 分布式拒绝服务DDoS与防御 2.3 ARP欺骗攻击与防御 2.4 DNS欺骗与防御 2.5 IP欺骗与防御 2.6 端口扫描&#xff08;Port Scanning&#xff09; 2.7 强化TCP/IP堆栈以抵御拒绝服务攻击 2.8 系统漏洞扫描 三、信息安…

基于weixin小程序乡村旅游系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;旅游景点管理&#xff0c;景点类型管理&#xff0c;景点路线管理&#xff0c;系统管理 商家帐号账号功能包括&#xff1a;系统首页&#xff0c;旅游景点管理&…

ArchLinux挑战安装(ZFS、Wayland、KDE、xero)

目录 0. 前言&#xff1a; 1. 先期准备 1.1 引导ArchLinx光盘。 1.2 禁用 reflector 服务 1.3 防止网卡禁用 1.4 wifi设置 1.5 测试网络是否连接 1.6 更新系统时间 1.7 更换源 1.8 下载ZFS模块 1.9 加载ZFS模块 2. 磁盘处理 2.1 查看磁盘分区 2.2 清除与整个磁盘…

HTML5与HTML:不仅仅是标签的革新

当我们提到HTML5&#xff0c;很多人会想到这是HTML的一个升级版本&#xff0c;增加了许多新的标签和特性。然而&#xff0c;HTML5带来的变化远不止于此。它是一个全面的网页开发框架&#xff0c;重新定义了网络应用程序的构建方式&#xff0c;为开发者提供了前所未有的灵活性和…

【数组】- 最小覆盖子串

1. 对应力扣题目连接 最小覆盖子串 2. 实现案例代码 public class MinimumCoveringSubstring {public static void main(String[] args) {System.out.println(minWindow("ADOBECODEBANC", "ABC")); // 输出&#xff1a;"BANC"System.out.prin…

解决RuntimeError: Unsupported image type, must be 8bit gray or RGB image.

今天在使用Opencv进行人脸识别项目时发现了一个问题&#xff0c;一直报这个错误RuntimeError: Unsupported image type, must be 8bit gray or RGB image.查了一下资料也是解决了&#xff0c;这样给大家分享一下 解决方案 Numpy 有一个主要版本更新&#xff0c;与 dlib 不兼容。…

【Docker】创建 swarm 集群

目录 1. 更改防火墙设置 2. 安装 Docker 组件 3. 启动 Docker 服务&#xff0c;并检查服务状态。 4. 修改配置文件&#xff0c;监听同一端口号。 5. 下载 Swarm 组件 6. 创建集群&#xff0c;加入节点 7. 启动集群 8. 查询集群节点信息 9. 查询集群具体信息 10. 查询…

电脑文件concrt140.dll丢失要怎么恢复?靠谱修复方法分析

电脑文件concrt140.dll丢失这种情况&#xff0c;相对来说还是比较少见的&#xff01;但是不代表没有&#xff0c;既然有人出现这种情况了&#xff0c;那么小编势必要给大家详细的讲解一下concrt140.dll这个文件&#xff0c;以及我们要怎么去解决concrt140.dll文件丢失的问题。下…

hnust 1817 算法10-10,10-11:堆排序

hnust 1817 算法10-10,10-11&#xff1a;堆排序 题目描述 堆排序是一种利用堆结构进行排序的方法&#xff0c;它只需要一个记录大小的辅助空间&#xff0c;每个待排序的记录仅需要占用一个存储空间。 首先建立小根堆或大根堆&#xff0c;然后通过利用堆的性质即堆顶的元素是最…

【算法篇】查找字符串数组中的最长公共前缀

问题描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”“”。 示例 1: 输入: [“flower”,“flow”,“flight”] 输出: “fl” 示例 2: 输入: [“dog”,“racecar”,“car”] 输出: “” 解题 为了解决这个问题,我们可以遍历…