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

  • 37
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis的三级缓存机制指的是MyBatis在执行SQL语句时,会默认启用三级缓存,以提高查询性能。 三级缓存分别是: 1. 一级缓存:也称为本地缓存,指的是MyBatis在同一次会话中执行相同SQL语句时,会将结果缓存到内存中,下次查询相同的SQL语句时,直接从缓存中读取结果,而不会再次执行SQL语句。一级缓存的作用域是会话级别的。 2. 二级缓存:也称为全局缓存,指的是MyBatis在多次会话中执行相同SQL语句时,会将结果缓存到内存中,下次查询相同的SQL语句时,直接从缓存中读取结果,而不会再次执行SQL语句。二级缓存的作用域是Mapper级别的。 3. 三级缓存:也称为分布式缓存,指的是MyBatis在多个应用程序之间共享缓存,以提高查询性能。三级缓存的作用域是全局级别的,需要使用第三方缓存组件来实现。 需要注意的是,三级缓存在默认情况下是关闭的,需要手动开启。开启方法如下: 在mybatis-config.xml文件中添加如下配置: ``` <settings> <setting name="cacheEnabled" value="true"/> <setting name="localCacheScope" value="SESSION"/> <setting name="lazyLoadingEnabled" value="true"/> </settings> ``` 其中,cacheEnabled表示是否开启缓存,localCacheScope表示一级缓存的作用域,lazyLoadingEnabled表示是否启用延迟加载。 需要注意的是,开启二级缓存时,需要在Mapper.xml文件中添加如下配置: ``` <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> ``` 其中,type属性指定了缓存的类型,这里使用了EhcacheCache。需要在项目中添加Ehcache的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值