MyBatis缓存配置的完整示例,包含一级缓存、二级缓存、自定义缓存策略等核心场景,并附详细注释和总结表格

以下是MyBatis缓存配置的完整示例,包含一级缓存、二级缓存、自定义缓存策略等核心场景,并附详细注释和总结表格:
在这里插入图片描述


1. 一级缓存(默认开启)

// 使用同一SqlSession执行两次查询,自动命中一级缓存
try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user1 = mapper.selectById(1);  // 第一次查询(数据库)User user2 = mapper.selectById(1);  // 第二次查询(缓存命中)System.out.println(user1 == user2); // 输出:true
}

2. 二级缓存配置(XML方式)

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper"><!-- 开启二级缓存 --><cache eviction="FIFO"         <!-- 缓存回收策略:先进先出 -->flushInterval="60000"   <!-- 缓存刷新间隔:60秒 -->size="512"              <!-- 缓存最大条目数 -->readOnly="false"/>      <!-- 是否只读(false允许对象修改) --><select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id}</select>
</mapper>

3. 二级缓存注解配置

// UserMapper.java
@Mapper
@CacheNamespace(implementation = EhcacheCache.class, // 使用第三方缓存(如Ehcache)eviction = CacheNamespaceEvictionPolicy.FIFO,flushInterval = 60000,size = 512,readWrite = true
)
public interface UserMapper {User selectById(Integer id);
}

4. 缓存对象序列化配置

// User实体类需要实现Serializable接口
public class User implements Serializable {private Integer id;private String name;private transient Integer age; // transient字段不参与序列化// 省略getter/setter
}

5. 缓存手动操作示例

// 清除指定对象缓存
sqlSession.clearCache(); // 清除一级缓存
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.selectById(1); 
sqlSession.commit(); // 触发二级缓存更新// 清除二级缓存
((org.apache.ibatis.session.Configuration)sqlSession.getConfiguration()).getCache("com.example.mapper.UserMapper").clear();

关键技术点总结表

场景配置方式适用情况核心注释
一级缓存默认开启(SqlSession级别)单次业务操作内多次查询不需要配置,关闭需调用sqlSession.clearCache()
二级缓存<cache>标签或@CacheNamespace跨SqlSession的全局缓存必须实现Serializable,需在Mapper配置中显式开启
缓存回收策略eviction="FIFO/LRU/SID"控制内存占用LRU(最近最少使用)最常用
缓存过期flushInterval="60000"定时刷新缓存毫秒单位,配合数据库数据变更频率设置
缓存容量size="512"控制内存使用根据业务数据量合理设置
缓存可写性readOnly="false"允许修改缓存对象readOnly为true时返回对象为不可变副本
第三方缓存implementation=EhcacheCache需要分布式缓存需引入对应依赖并配置缓存实现类

6. 核心配置注意事项:

  1. 序列化要求:被缓存的对象必须实现Serializable接口
  2. 事务边界:SqlSession关闭或提交(commit)会刷新二级缓存
  3. 并发控制readOnly="true"可避免并发修改问题
  4. 缓存失效:数据更新操作(insert/update/delete)会自动清除相关缓存
  5. 命名空间:二级缓存按Mapper命名空间隔离,需确保唯一性

7. 性能验证示例

// 验证二级缓存跨SqlSession命中
try (SqlSession session1 = sqlSessionFactory.openSession()) {UserMapper mapper1 = session1.getMapper(UserMapper.class);User user1 = mapper1.selectById(1); // 数据库查询
}try (SqlSession session2 = sqlSessionFactory.openSession()) {UserMapper mapper2 = session2.getMapper(UserMapper.class);User user2 = mapper2.selectById(1); // 二级缓存命中System.out.println(user1.equals(user2)); // 输出:true(值相等但对象不同)
}

需要进一步扩展场景(如条件缓存、自定义缓存实现)可补充说明。

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

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

相关文章

深入解析 C++17 中的std::variant与std::visit:从原理到实践

引言 什么是std::variant 在 C17 之前&#xff0c;如果你想在一个变量中存储多种可能的类型&#xff0c;通常会使用 union 或 void* 指针。然而&#xff0c;这些方法都有明显的缺点。 使用 union 时&#xff0c;类型信息会丢失&#xff0c;使得代码容易出错。 void* 指针则需…

Dijkstra算法对比图神经网络(GNN)

什么是AI模型? AI模型(人工智能模型)是一类模仿人类智能行为的数学模型或算法。它们通过从大量数据中学习,识别模式、做出预测或决策。常见的AI模型包括机器学习模型(如决策树、神经网络、支持向量机)和深度学习模型(如卷积神经网络CNN、循环神经网络RNN)。简单来说,…

Yarn 安装与使用教程

Yarn 安装与使用教程 Yarn 是一个由 Facebook 开发的 JavaScript 包管理工具&#xff0c;它比传统的 npm 更加高效、可靠&#xff0c;并且在性能上有所提升。Yarn 主要解决了 npm 安装速度慢、并发性差、缓存机制不完善等问题&#xff0c;它提供了更快的安装速度、更稳定的依赖…

Spring Boot 的配置加载顺序

Spring Boot 的配置加载顺序是“后来居上”——优先级高的配置源会覆盖优先级低的配置源中的同名配置 覆盖规则如下&#xff1a; 后加载的配置具有更高的优先级&#xff0c;会覆盖先加载的配置。如果多个配置源中存在同名配置项&#xff0c;最终生效的是具有最高优先级的那个…

Git分支重命名与推送参数解析

这两个参数的解释如下&#xff1a; git branch -M master 中的 -M 参数 -M 是 --move --force 的组合简写&#xff0c;表示强制重命名当前分支为 master。如果当前分支已经存在名为 master 的分支&#xff0c;-M 会强制覆盖它&#xff08;慎用&#xff0c;可能导致数据丢失&…

qt源码编译

问题1&#xff1a; 源码头文件问题&#xff1a; 有部分头文件缺少#include<limits>头文件 home/jetson/qt-everywhere-src-5.15.2/qtbase/include/QtCore/qfloat16.h /home/jetson/qt-everywhere-src-5.15.2/qtbase/src/corelib/text/qbytearraymatcher.h 问题2&…

芯岭技术XL32F003单片机 32位Cortex M0+ MCU简单介绍 性能优异

XL32F003单片机是深圳市芯岭技术有限公司的一款基于 32 位 ARM Cortex-M0 内核的高性能微控制器&#xff0c;提供SOP8/SOP14/SOP16/TSSOP20/SSOP24/QFN20/QFN32多种封装可选&#xff0c;可满足不同设计需求。XL32F003可用于工业控制、手持设备、PC 外设、传感器节点等应用场景&…

计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形

在Qt项目中结合OpenGL与CMake需要配置正确的依赖关系、链接库以及代码结构设计。以下是具体实现步骤和关键要点&#xff1a; 一、环境准备 安装Qt 确保安装包含OpenGL模块的Qt版本&#xff08;如Qt OpenGL、Qt OpenGLWidgets组件&#xff09;。安装CMake 使用3.10及以上版本&a…

3:QT联合HALCON编程—海康相机SDK二次程序开发

思路&#xff1a; 1.定义带UI界面的主函数类 1.1在主函数中包含其它所有类头文件&#xff0c;进行声明和实例化&#xff1b;使用相机时&#xff0c;是用公共相机的接口在某一个具体函数中去实例化具体的海康相机对象。 1.2设计界面&#xff1a;连接相机&#xff0c;单次采集&a…

基于大模型底座重构司法信息系统

前置篇章&#xff1a;法律智能体所需的基础知识 构建一个高效的法律智能体&#xff0c;特别是在基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;架构的背景下&#xff0c;需要融合多种学科和领域的知识。以下是对法律智能体开发和应用所需核心基础知识的简要介…

类《双人成行》3D动作益智冒险类双人控制游戏开发

服务器端采用了基于开源Kbengine&#xff08;引擎使用C和Python编写&#xff09;的多人在线游戏服务器&#xff0c;客户端采用Unity3D。游戏支持线上的双人联机房间功能。 资源地址&#xff1a;类《双人成行》3D动作益智冒险类双人控制游戏开发教程 | Unity 中文课堂 一、游戏…

Spark--基本介绍

Spark是基于内存的快速&#xff0c;通农用&#xff0c;可拓展的大数据分析计算引擎&#xff0c;Hadoop是一个分布式系统基础架构 Spark和Hadoop之间的对比和联系 架构与组件&#xff1a; Hadoop&#xff1a; ■ HDFS&#xff1a;分布式文件系统&#xff0c;负责海量数据存储。…

05-GPIO原理

一、概述 1、GPIO,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 2、GPIO的复用:引脚复用是指将单个引脚配置为多个功能的能力。在 STM32 中&…

基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发

基于LangChain4J的AI Services实践&#xff1a;用声明式接口重构LLM应用开发 前言&#xff1a;当Java开发遇上LLM编程困境 在LLM应用开发领域&#xff0c;Java开发者常面临两大痛点&#xff1a;一是需要手动编排Prompt工程、记忆管理和结果解析等底层组件&#xff0c;二是复杂…

深入解析 Docker 容器进程的 cgroup 和命名空间信息

深入解析 Docker 容器进程的 cgroup 和命名空间信息 在现代 Linux 系统中&#xff0c;控制组&#xff08;cgroup&#xff09;和命名空间&#xff08;namespace&#xff09;是实现容器化技术的核心机制。cgroup 用于管理和限制进程的资源使用&#xff08;如 CPU、内存、I/O&…

【汽车ECU电控数据管理篇】S19文件格式解析篇章

一、S19格式是啥 在电控文件管理的初期阶段&#xff0c;我首次接触到的是 A2L 和 HEX 文件。其中&#xff0c;A2L 文件主要承担着描述性功能&#xff0c;它详细地描述了各种参数和配置等相关信息。而 HEX 文件则是一种刷写文件&#xff0c;其内部明确记录了具体的地址以及对应的…

python编程相关的单词

the: 在编程中&#xff0c;“the” 是一个常见的英语单词&#xff0c;用于指定特定的对象或变量。例如&#xff0c;“the function” 指的是某个特定的函数。 the的拼写是t,h,e.再读一次t,h,e and: 在编程中&#xff0c;“and” 是一个逻辑运算符&#xff0c;用于连接两个条件&…

网络原理 - 4(TCP - 1)

目录 TCP 协议 TCP 协议段格式 可靠传输 几个 TCP 协议中的机制 1. 确认应答 2. 超时重传 完&#xff01; TCP 协议 TCP 全称为 “传输控制协议”&#xff08;Transmission Control Protocol&#xff09;&#xff0c;要对数据的传输进行一个详细的控制。 TCP 协议段格…

python博客爬虫列表

我希望对指定网页的&#xff0c;博客列表&#xff0c;获取url&#xff0c;然后保存成本地文件&#xff0c;用python实现 step1: import requests from bs4 import BeautifulSoup import jsondef get_blog_links(url):headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win6…

软件测试入门学习笔记

今天学习新知识&#xff0c;软件测试。 什么是软件测试&#xff1f; 使用人工和自动手段来运行或测试某个系统的过程&#xff0c;目的在于检验它是否满足规定的需求或弄清实际结果与预期结果之间的差别。 软件测试的目的&#xff1f; 1&#xff09;为了发现程序&#xff0…