第9章:MyBatis多级缓存和懒加载

文章目录

  • 第9章:MyBatis多级缓存和懒加载
    • 一级缓存
    • 二级缓存怎么使用
    • 懒加载

第9章:MyBatis多级缓存和懒加载

一级缓存

什么是缓存?

一级缓存核心定位

  • 一级缓存是 MyBatis 内置的默认缓存机制,无需手动配置,默认开启。
  • 作用域:
    • 仅限当前SqlSession(数据库会话)
    • 不同 SqlSession 之间的缓存相互隔离。
  • 缓存介质:
  • 内存(基于HashMap存储),缓存键由Mapper ID + SQL 语句 + 参数 + 分页信息 + 环境信息组成。

核心价值:

  • 减少同一 SqlSession 内重复查询的数据库交互,提升查询性能。

  • 一级缓存生效与失效条件

    场景类型生效条件失效条件
    核心前提同一 SqlSession、相同 Mapper ID+SQL + 参数不同 SqlSession、SQL / 参数 / 分页不同
    数据库操作影响未执行增删改(insert/update/delete)操作执行增删改操作(自动清空当前 SqlSession 缓存)
    手动干预未调用clearCache()close()方法调用sqlSession.clearCache()(手动清空)、sqlSession.close()(关闭会话)
    配置影响默认配置(无特殊禁用)全局配置localCacheScope=STATEMENT(禁用一级缓存)

一级缓存工作流程

一级缓存核心特性:

@Service@Slf4jpublicclassUserService{@AutowiredprivateSqlSessionTemplatesqlSessionTemplate;/*一级缓存 有效的访问*/publicvoidfirstCache(){SqlSessionFactorysqlSessionFactory=sqlSessionTemplate.getSqlSessionFactory();SqlSessionsqlSession=sqlSessionFactory.openSession();UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);Useruser=userMapper.selectById(1);log.info("第一次查询结果:{}",user);Useruser2=userMapper.selectById(1);log.info("第二次查询结果:{}",user2);log.info("两个user是否是同一个对象:{}",user==user2);sqlSession.close();}/*一级缓存 失效的访问*/publicvoidfirstCacheInvalidation(){SqlSessionFactorysqlSessionFactory=sqlSessionTemplate.getSqlSessionFactory();SqlSessionsqlSession=sqlSessionFactory.openSession();UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);Useruser=userMapper.selectById(1);log.info("第一次查询结果:{}",user);/*执行 写的操作*/user.setAge(18);introws=userMapper.update(user);log.info("执行写的操作,影响行数:{}",rows);//清空缓存// sqlSession.clearCache();Useruser2=userMapper.selectById(1);log.info("第二次查询结果:{}",user2);log.info("两个user是否是同一个对象:{}",user==user2);sqlSession.close();}}

二级缓存怎么使用

核心概念界定

二级缓存核心定位

  • 二级缓存(Mapper 级缓存)是 MyBatis 的跨 SqlSession 缓存
    • 作用域为同一个 Mapper(namespace)
    • 不同 SqlSession 可共享缓存数据。
  • 缓存介质:
    • 默认内存(HashMap),支持自定义(如 Redis等第三方缓存)
  • 核心价值:
    • 减少不同 SqlSession 间重复查询的数据库交互
    • 适用于查询频率高、修改频率低的数据(如字典表、配置表)
  • 依赖条件:实体类需实现Serializable接口,需手动开启

一级缓存与二级缓存核心区别

对比维度一级缓存(SqlSession 级)二级缓存(Mapper 级)
作用域单个 SqlSession同一个 Mapper(namespace)
共享性不可跨 SqlSession 共享可跨 SqlSession 共享
开启方式默认开启,无需配置需全局配置 + Mapper 配置手动开启
实体类要求无强制序列化要求必须实现 Serializable 接口
失效触发同一 SqlSession 内增删改、clearCache ()对应 Mapper 内增删改操作、缓存过期等
适用场景单会话内重复查询多会话共享高频查询数据

二级缓存工作流程

二级缓存开启条件(三步缺一不可)

  • 全局配置开启:
    • springBoot 配置文件中设置cacheEnabled=true
  • Mapper 级开启:
    • 在 Mapper XML 中添加<cache/>标签
  • 实体类序列化:
    • 缓存的实体类必须实现java.io.Serializable接口(避免序列化异常)。

二级缓存配置详解

mybatis:configuration:cache-enabled:true# 启用二级缓存
<!-- Mapper XML 中配置二级缓存 --><mappernamespace="com.example.mapper.UserMapper"><!-- 开启二级缓存配置 --><cacheeviction="LRU"flushInterval="60000"size="512"readOnly="true"/><selectid="selectUserById"parameterType="long"resultType="User"useCache="true">SELECT * FROM user WHERE id = #{id}</select></mapper>

二级缓存属性详解表

属性可选值默认值说明
evictionLRU/FIFO/SOFT/WEAKLRU缓存回收策略
flushInterval毫秒数缓存刷新间隔
size正整数1024缓存引用数量
readOnlytrue/falsefalse是否只读
blockingtrue/falsefalse是否使用阻塞缓存

常见的缓存回收策略:

策略缩写全称策略说明
LRULeast Recently Used移除最长时间未被使用的对象(默认策略)。
FIFOFirst In First Out按对象进入缓存的顺序来移除它们。
SOFTSoft Reference基于垃圾回收器状态和软引用规则来移除对象。
WEAKWeak Reference更积极地基于垃圾收集器状态和弱引用规则移除对象。
// 使用二级缓存需要实体类实现Serializable接口@Data@NoArgsConstructor@AllArgsConstructorpublicclassUserimplementsSerializable{privateLongid;privateStringusername;privateStringemail;privateIntegerage;privateDatecreateTime;privateDateupdateTime;// 关联对象也需要序列化}
// 二级缓存服务演示@Service@Slf4jpublicclassSecondLevelCacheService{@AutowiredprivateUserMapperuserMapper;/** * 演示二级缓存跨SqlSession共享 */publicvoiddemonstrateSecondLevelCache(){Useruser1=userMapper.selectUserById(1L);log.info("SqlSession查询: {}",user1);// 重新调用方法模拟第二个SqlSession(实际应用中可能是另一个请求)log.info("=== 二级缓存演示结束 ===");}/** * 二级缓存失效场景 */publicvoiddemonstrateSecondLevelCacheInvalidation(){// 执行更新操作Useruser1=newUser();user1.setId(1L);user1.setEmail("newemail@example.com");intupdateCount=userMapper.updateUser(user1);log.info("更新影响行数: {}",updateCount);}}

懒加载

懒加载核心定位

  • 懒加载(延迟加载)是 MyBatis 关联查询的性能优化机制
    • 指查询主对象时,不立即加载关联对象
    • 而是在首次访问关联对象时才触发查询xa
  • 对立概念:
    • 立即加载(默认行为),查询主对象时同时加载所有关联对象
  • 核心价值:
    • 避免不必要的关联查询,
    • 减少数据库压力
    • 如仅需查询用户基本信息时,无需加载其所有订单
  • 适用场景:
    • 一对一、一对多、多对多关联查询,且关联数据不总是需要使用

懒加载与立即加载对比

懒加载开启条件

  • 全局配置开启延迟加载:
    • lazyLoadingEnabled=true(默认 false)
  • 关闭积极加载:
    • aggressiveLazyLoading=false
    • SpringBoot 2.x+ 已默认关闭,确保按需加载
  • 关联标签配置(可选):
    • associationcollection标签添加fetchType="lazy"(优先级高于全局配置)

懒加载配置详解

mybatis:configuration:lazy-loading-enabled:true# 开启全局懒加载aggressive-lazy-loading:false# 关闭积极加载(按需加载)map-underscore-to-camel-case:true

懒加载实战案例

<!-- 基础用户结果映射(不包含关联对象) --><resultMapid="BaseUserMap"type="com.example.entity.User"><idcolumn="user_id"property="userId"/><resultcolumn="user_name"property="userName"/><resultcolumn="card_id"property="cardId"/></resultMap><!-- 嵌套查询结果映射:使用子查询方式加载关联对象 --><resultMapid="UserWithIdCardNestedQueryMap"type="com.example.entity.User"extends="BaseUserMap"><associationproperty="idCard"column="card_id"select="com.example.mapper.IdCardMapper.selectById"javaType="com.example.entity.IdCard"fetchType="lazy"/></resultMap><!-- 嵌套查询方式:查询用户(触发子查询加载身份证) --><selectid="selectUserWithIdCardNested"resultMap="UserWithIdCardNestedQueryMap">SELECT user_id, user_name, card_id FROM t_user WHERE user_id = #{userId}</select>

懒加载最佳实践

  • 适用场景:

    • 关联数据量大,且不经常使用
    • 需要快速响应的列表查询
    • 移动端应用,减少数据传输
  • 注意事项:
    ) -->

    SELECT
    user_id,
    user_name,
    card_id
    FROM t_user
    WHERE user_id = #{userId}

懒加载最佳实践 - 适用场景: - 关联数据量大,且不经常使用 - 需要快速响应的列表查询 - 移动端应用,减少数据传输 - 注意事项: - 注意 N+1 查询问题

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

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

相关文章

Gemini 3超参数设置全攻略

通过 Api 调用gemini 3 的温度等超参数怎么设置 温度0.7 温度设置0.1 LLM 超参数介绍

全面覆盖!同城便民信息小程序源码系统,功能强大

温馨提示&#xff1a;文末有资源获取方式作为一款专注于多城市生活服务的同城便民信息小程序源码系统&#xff0c;全新升级版本带来了前所未有的功能整合和技术优化。该系统旨在满足现代人对便捷、高效生活服务的需求&#xff0c;通过一套源码即可轻松搭建一个功能完备的同城信…

基于STM32单片机PM2.5空气质量检测仪粉尘无线视频监控设计套件44(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于STM32单片机PM2.5空气质量检测仪粉尘无线视频监控设计套件44(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 STM32单片机PM2.5空气质量检测雾霾检测除尘系统44产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板…

技术领先!多用户同城小程序源码系统 带完整的搭建部署教程

温馨提示&#xff1a;文末有资源获取方式 在信息爆炸的时代&#xff0c;一款基于先进技术的同城便民信息小程序源码系统应运而生&#xff0c;全新版本以多用户无限账户为核心&#xff0c;为创业者提供前所未有的机会。该系统专注于多城市生活服务&#xff0c;通过灵活的技术架构…

2026年知名的服务器公司哪家专业?高性价比品牌排行

在2026年的服务器市场中,选择一家专业且高性价比的供应商需要综合考虑技术实力、定制能力、生产规模、行业口碑和价格竞争力。经过对行业发展趋势和实际用户反馈的分析,我们推荐以下五家各具特色的服务器供应商,其中…

【直播预告】 复刻高德地图导航——GIS开发实战直播来袭!

如果你希望掌握WebGIS开发的核心技能&#xff0c;提升自己在GIS领域的竞争力。本周四下午2点&#xff0c;我们将带来一场适合webgis小白学习的技术直播&#xff0c;使用Vue框架开发高德地图的导航功能。适合人群&#xff1a;对GIS开发感兴趣、想从事地图开发的学生/在职人员。无…

零基础入门指南,如何利用酒店预订系统源码快速开展数字业务

温馨提示&#xff1a;文末有资源获取方式面对酒店行业日益增长的线上化需求&#xff0c;许多非技术出身的创业者或中小酒店业主感到无从下手。市场上出现的一款一体化酒店预订小程序源码系统&#xff0c;完美解决了这一痛点。它被誉为“技术小白也能驾驭的创业利器”&#xff0…

基于STM32单片机恒温箱K型热电偶工业锅炉温度无线APP设计套件16(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于STM32单片机恒温箱K型热电偶工业锅炉温度无线APP设计套件16(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码STM32单片机智能热电偶工业锅炉温度控制恒温箱16 产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、…

linux,统信,ubuntu,cenots添加默认路由

如何让一个网络IP地址段的网络走指定的端口呢&#xff1f;ip route add 10.179.1.0/24 via 10.202.1.1 dev eth1解释一下&#xff1a;添加一条IP路由10.179.1.0/24的路由&#xff0c;通过10.202.1.1的eth1的端口发送出去。这样所有的往来的数据就通过这个端口转发数据了&#x…

基于STM32单片机智能交通灯红绿灯按键模拟人流量控制设计套件85(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于STM32单片机智能交通灯红绿灯按键模拟人流量控制设计套件85(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码STM32单片机智能交通灯红绿灯系统液晶显示85 产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、LED…

2026年GEO服务商选型观察:技术、垂直与合规的三大路径

2026年GEO服务商选型观察:技术、垂直与合规的三大路径随着生成式AI彻底重构信息检索的逻辑,传统的搜索引擎优化(SEO)正在向生成式引擎优化(GEO)快速演进。对于希望在AI时代获取持续流量与品牌权威的企业而言,选…

Spring框架核心

Spring 框架核心详解&#xff08;2025-2026 主流认知版&#xff09; Spring 框架发展到今天&#xff08;Spring Framework 6.x Spring Boot 3.x 时代&#xff09;&#xff0c;其核心已经非常清晰&#xff0c;主要围绕以下 6 大核心支柱 构建&#xff0c;几乎所有高级功能都是…

智能综合管理平台,何以破解咨询企业管理痛点?

某中型管理咨询公司&#xff0c;专精特新企业&#xff0c;深耕企业管理咨询领域多年&#xff0c;业务辐射全国&#xff0c;服务过众多行业领军企业。随着市场版图持续扩大&#xff0c;客户资源量级攀升、销售团队规模扩容&#xff0c;原有粗放式管理模式逐渐暴露出诸多短板。 一…

第8章:从jdbc到MyBatis

文章目录第8章&#xff1a;从jdbc到MyBatisJDBC操作数据库原生JDBC访问数据库缺点和ORM框架介绍Mybatis基础知识SpringMybatis快速入门第8章&#xff1a;从jdbc到MyBatis JDBC操作数据库 JDBC核心概念 Java Database Connectivity&#xff08;Java数据库连接&#xff09;Jav…

时间同步服务器大型单位推荐

一次时间同步问题的排查与取舍 ——关于北斗 NTP 与本地守时的工程实践 在一个内部业务系统中,我们曾遇到一个看似不起眼、但反复出现的问题: ​不同系统日志时间存在偏差,问题复盘时很难对齐事件顺序​。 起初大家…

Python神经网络、随机森林、PCA、SVM、KNN及回归实现ERα拮抗剂、ADMET数据预测|附代码数据

全文链接&#xff1a;tecdat.cn/?p44844原文出处&#xff1a;拓端数据部落公众号关于分析师在此对Shoufu Lin对本文所作的贡献表示诚挚感谢&#xff0c;他在浙江工业大学完成了工业工程与管理专业的硕士学位&#xff0c;专注深度学习、运筹优化领域。擅长Python、深度学习、运…

基于51/STM32单片机电机霍尔测速PWM控制PID无刷CAN总线无线设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于51/STM32单片机电机霍尔测速PWM控制PID无刷CAN总线无线设计(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码基于51/STM32单片机电机霍尔测速PWM控制PID无刷CAN总线无线设计(设计源文件万字报告讲解)&#xff08;支持资料、…

服务器里面多个网口,电口,光口确定

在设备服务器上架时会涉及到配置网络和IP地址&#xff0c;确认端口的问题&#xff0c;对于有BMC系统的服务器&#xff0c;直接插入光模块和光纤后&#xff0c;可以在BMC里面确认好连接的哪个端口&#xff0c;端口会显示是否已连接光纤。 但是有时候在统信 等linux系统下面使用i…

携程闹乌龙,误发通知全员都被离职了。

1月12日晚&#xff0c;大量携程员工突然收到一条措辞正式的离职通知短信&#xff0c;内容以“XX你好&#xff0c;感谢一路相伴”开头。此次乌龙事件源于内部沟通软件trappal下线&#xff0c;在关停关联手机号绑定功能时&#xff0c;工作人员未提前关闭系统预设的短信提醒&#…

Python用Ridge、Lasso、KNN、SVM、决策树、随机森林、XGBoost共享单车数据集需求预测及动态资源调配策略优化|附代码数据

全文链接&#xff1a;tecdat.cn/?p44851原文出处&#xff1a;拓端数据部落公众号关于分析师在此对Weiduoduo Han对本文所作的贡献表示诚挚感谢&#xff0c;她深耕大数据技术领域&#xff0c;系统掌握Python、Java、Spark等技术工具&#xff0c;精通Java程序设计、数据结构、计…