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`则在加载主对象时就立即加载所有关联对象。

  1. 一级缓存(Local Cache)

一级缓存是默认开启的,无需特别配置。它的特性如下:

  • 范围:Session级别。

  • 生命周期:Session的生命周期内有效,Session关闭或清空时,一级缓存也被清空。

  • 刷新机制:执行更新操作后,一级缓存自动清空。

  1. 二级缓存(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可以显著提高数据库操作的性能,并减少数据库的负担。在实际应用中,需要根据业务需求和数据访问特点灵活调整这些设置。

相关推荐
亚历克斯神1 小时前
Java 职业发展:2026 指南
java·spring·微服务
披着羊皮不是狼2 小时前
(7)为 RAG 系统接入 Redis Stack 实现向量持久化
数据库·redis·缓存
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【13】 检查点 (Checkpoint) 机制及各类持久化实现
java·人工智能·spring
難釋懷3 小时前
数据同步策略
缓存
行走的搬运工4 小时前
Spring Security_05
java·spring·mybatis
无级程序员4 小时前
Mybatis中保证时间戳的一致性
mybatis
我登哥MVP4 小时前
【Spring6笔记】 - 11 - JDBCTemplate
java·数据库·spring boot·mysql·spring
也许明天y4 小时前
Spring AI 核心原理解析:基于 1.1.4 版本拆解底层架构
java·后端·spring
希望永不加班4 小时前
SpringBoot 自定义 Starter:从零开发一个私有 Starter
java·spring boot·后端·spring·mybatis
callJJ5 小时前
Spring AI ETL 数据处理管道实战指南:从原始文档到向量索引
java·人工智能·spring·ai·etl·spring ai