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 小时前
Mybatis的插件原理
面试·mybatis
莫寒清3 小时前
Apache Tika
java·人工智能·spring·apache·知识图谱
没有bug.的程序员3 小时前
电商秒杀系统深度进阶:高并发流量建模、库存零超卖内核与 Redis+MQ 闭环
数据库·redis·缓存·高并发·电商秒杀·流量建模·库存零超卖
troublea4 小时前
ThinkPHP3.x高效学习指南
mysql·nginx·缓存
工业甲酰苯胺4 小时前
一文学习 Spring AOP 源码全过程
java·学习·spring
troublea4 小时前
ThinkPHP6快速入门指南
数据库·mysql·缓存
莫寒清5 小时前
MyBatis 中动态 SQL 的作用
面试·mybatis
昱宸星光5 小时前
Xnio源码分析
java·jvm·spring
Emotional。5 小时前
AI Agent 性能优化和成本控制
人工智能·深度学习·机器学习·缓存·性能优化
吹晚风吧5 小时前
实现一个mybatis插件,方便在开发中清楚的看出sql的执行及执行耗时
java·sql·mybatis