当前位置: 首页 > news >正文

MyBatis 延迟加载,一级缓存,二级缓存设置

 MyBatis不仅提供了一级缓存和二级缓存机制,还支持延迟加载(Lazy Loading),以进一步优化性能。

 1. 延迟加载(Lazy Loading)
延迟加载是在需要时才加载数据,而不是在查询时立即加载所有相关数据。这对于提高性能和减少不必要的数据加载有很大的帮助。

配置延迟加载:

在MyBatis的全局配置文件中启用延迟加载:
xml
<settings>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="aggressiveLazyLoading" value="false"/>
</settings>

- `lazyLoadingEnabled`:启用延迟加载。
- `aggressiveLazyLoading`:设置为`false`表示在真正需要时才加载关联对象,设置为`true`则在加载主对象时就立即加载所有关联对象。

 2. 一级缓存(Local Cache)
一级缓存是默认开启的,无需特别配置。它的特性如下:
- 范围:Session级别。
- 生命周期:Session的生命周期内有效,Session关闭或清空时,一级缓存也被清空。
- 刷新机制:执行更新操作后,一级缓存自动清空。

 3. 二级缓存(Global Cache)
二级缓存需要显式配置,适用于跨Session的缓存共享。

配置二级缓存:

在MyBatis的XML映射文件中启用二级缓存:
xml
<mapper namespace="com.example.MyMapper">
  <!-- 启用二级缓存 -->
  <cache/>
  
  <!-- 其他映射配置 -->
</mapper>

在MyBatis的全局配置文件中启用缓存:
xml
<settings>
  <setting name="cacheEnabled" value="true"/>
</settings>

缓存策略和冲突解决:

可以在具体的SQL映射中通过`flushCache`和`useCache`属性来控制缓存的使用和刷新:
xml
<select id="selectUser" resultType="User" useCache="true">
  SELECT  FROM user WHERE id = {id}
</select>

<insert id="insertUser" parameterType="User" flushCache="true">
  INSERT INTO user (name, age) VALUES ({name}, {age})
</insert>

- `useCache`:是否使用二级缓存。
- `flushCache`:执行后是否刷新缓存。

手动清空缓存:

在需要的情况下,可以手动清空缓存来解决数据不一致问题:
java
// 清空一级缓存
sqlSession.clearCache();

// 清空二级缓存
sqlSession.getConfiguration().getCache("com.example.MyMapper").clear();

 配置示例整合

全局配置文件(mybatis-config.xml):
xml
<configuration>
  <settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
  </settings>
</configuration>

映射文件(Mapper XML):
xml
<mapper namespace="com.example.MyMapper">
  <!-- 启用二级缓存 -->
  <cache/>

  <!-- 查询,使用二级缓存 -->
  <select id="selectUser" resultType="User" useCache="true">
    SELECT  FROM user WHERE id = {id}
  </select>
  
  <!-- 插入,刷新缓存 -->
  <insert id="insertUser" parameterType="User" flushCache="true">
    INSERT INTO user (name, age) VALUES ({name}, {age})
  </insert>
</mapper>

通过合理配置延迟加载、一级缓存和二级缓存,MyBatis可以显著提高数据库操作的性能,并减少数据库的负担。在实际应用中,需要根据业务需求和数据访问特点灵活调整这些设置。

相关文章:

  • Linux C语言:指针和指针变量
  • 用Python向Word文档添加页眉和页脚
  • Node.js 和 Vue 的区别的基本知识科普
  • 排名前五的 Android 数据恢复软件
  • 第一百零九节 Java面向对象设计 - Java抽象类和方法
  • 动手学深度学习33 单机多卡并行
  • 【 EI会议 | 西南大学主办 | 往届均已实现检索】第三届神经形态计算国际会议(ICNC 2024)
  • hana 中的缓存视图功能,类似ORACLE 中的 物化视图功能
  • Tinymce富文本编辑器在el-dialog中遮挡的问题
  • Jenkins 内置变量 和变量作用域
  • 【成品设计】基于物联网的停车管理系统设计与实现
  • Spring Boot:Java 应用开发高效之道
  • 数据结构之初识泛型
  • idea有这个类却报红,无法用快捷键找到
  • k8s+RabbitMQ单机部署
  • 深入了解以太坊
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • “大数据应用场景”之隔壁老王(连载四)
  • 【剑指offer】让抽象问题具体化
  • 5、React组件事件详解
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Phpstorm怎样批量删除空行?
  • Rancher-k8s加速安装文档
  • React-flux杂记
  • unity如何实现一个固定宽度的orthagraphic相机
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • web标准化(下)
  • 高性能JavaScript阅读简记(三)
  • 记一次删除Git记录中的大文件的过程
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 首页查询功能的一次实现过程
  • 由插件封装引出的一丢丢思考
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (160)时序收敛--->(10)时序收敛十
  • (2015)JS ES6 必知的十个 特性
  • (arch)linux 转换文件编码格式
  • (C#)获取字符编码的类
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (原)本想说脏话,奈何已放下
  • (转)jQuery 基础
  • .jks文件(JAVA KeyStore)
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET和.COM和.CN域名区别
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET中的Exception处理(C#)