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-Spring入门指南(二十六)Android Studio下载与安装
java·spring·android studio
阿巴~阿巴~1 小时前
Redis重大版本演进全解析:从2.6到7.0
服务器·数据库·redis·ubuntu·缓存·centos
cxyxiaokui0011 小时前
JDK 动态代理 vs CGLIB:原理、区别与 Spring AOP 底层揭秘
java·后端·spring
珹洺2 小时前
Java-Spring入门指南(二十五)Android 的历史,认识移动应用和Android 基础知识
android·java·spring
ajsbxi3 小时前
【Redis】缓存读/写操作流程
redis·笔记·spring·缓存·bootstrap
The best are water3 小时前
jeesite mybatis添加拦截器,推送指定表的变更数据到其他数据库
数据库·mybatis
lunz_fly19923 小时前
【源码解读之 Mybatis】【核心篇】-- 第6篇:StatementHandler语句处理器
mybatis
lunzi_fly4 小时前
【源码解读之 Mybatis】【核心篇】-- 第6篇:StatementHandler语句处理器
mybatis
艾菜籽4 小时前
SpringMVC练习:加法计算器与登录
java·spring boot·spring·mvc
程序员小凯5 小时前
Spring MVC 多租户架构与数据隔离教程
spring·架构·mvc