MyBatis不仅提供了一级缓存和二级缓存机制,还支持延迟加载(Lazy Loading),以进一步优化性能。
- 延迟加载(Lazy Loading)
延迟加载是在需要时才加载数据,而不是在查询时立即加载所有相关数据。这对于提高性能和减少不必要的数据加载有很大的帮助。
配置延迟加载:
在MyBatis的全局配置文件中启用延迟加载:
xml
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
-
`lazyLoadingEnabled`:启用延迟加载。
-
`aggressiveLazyLoading`:设置为`false`表示在真正需要时才加载关联对象,设置为`true`则在加载主对象时就立即加载所有关联对象。
- 一级缓存(Local Cache)
一级缓存是默认开启的,无需特别配置。它的特性如下:
-
范围:Session级别。
-
生命周期:Session的生命周期内有效,Session关闭或清空时,一级缓存也被清空。
-
刷新机制:执行更新操作后,一级缓存自动清空。
- 二级缓存(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可以显著提高数据库操作的性能,并减少数据库的负担。在实际应用中,需要根据业务需求和数据访问特点灵活调整这些设置。