当前位置: 首页 > news >正文

Mybatis缓存机制

在 MyBatis 中,缓存分为 一级缓存二级缓存。它们的作用是减少数据库查询次数,提高性能。然而,在某些情况下,缓存会失效或被清空。

一、一级缓存(sqlSession 级别缓存)

1. 一级缓存的基本特性
  • 一级缓存默认开启,作用范围是 SqlSession 的生命周期。
  • 在同一个 SqlSession 内,如果两次查询条件完全相同且没有发生更新操作,则第二次查询会直接从缓存中获取结果。
2. 一级缓存失效情形

以下情况会导致一级缓存失效:

  1. SqlSession 关闭或提交事务后

    • 当 SqlSession 被关闭或提交事务时,一级缓存会被清空。
    • 示例:
    sqlSession.commit(); // 提交事务后,一级缓存失效
    sqlSession.close();   // 关闭 SqlSession 后,一级缓存失效
  2. 执行了增删改操作

    • 如果在同一个 SqlSession 中执行了 insertupdate 或 delete 操作,MyBatis 会清空一级缓存。
    • 原因:这些操作可能会影响表中的数据,导致缓存中的数据与数据库不一致。
  3. 手动调用 clearCache() 方法

    • 开发者可以手动调用 sqlSession.clearCache() 来清空当前 SqlSession 的一级缓存。
  4. 查询条件不同

    • 如果两次查询的条件不同(即使只差一个参数),MyBatis 不会使用缓存。
  5. 查询间隔过长

    • 如果两次查询之间的时间间隔超过了 MyBatis 的缓存刷新时间(默认无限制),缓存可能会失效。

二、二级缓存(Mapper 级别缓存)

1. 二级缓存的基本特性
  • 二级缓存的作用范围是整个 Mapper 文件(即命名空间 namespace),多个 SqlSession 可以共享同一个二级缓存。
  • 默认情况下,二级缓存需要手动配置才能启用。
2. 配置二级缓存
<!-- 在 Mapper 文件中启用二级缓存 -->
<cache />
3. 二级缓存失效情形

以下情况会导致二级缓存失效:

  1. 未启用二级缓存

    • 如果未在 Mapper 文件中配置 <cache> 标签,或者未在全局配置文件中启用二级缓存(settings.cacheEnabled=true),则不会使用二级缓存。
  2. Mapper 方法未设置 useCache=true

    • 默认情况下,查询方法会使用二级缓存。如果将 useCache 设置为 false,则该方法不会使用二级缓存。
    • 示例:
    <select id="findUserById" resultType="User" useCache="false">
        SELECT * FROM users WHERE id = #{id}
    </select>
  3. Mapper 方法设置了 flushCache=true

    • 如果查询方法设置了 flushCache=true,则每次执行该方法时都会清空二级缓存。
    • 示例:
    <select id="findUserById" resultType="User" flushCache="true">
        SELECT * FROM users WHERE id = #{id}
    </select>
  4. 执行了增删改操作

    • 如果在同一个 Mapper 中执行了 insertupdate 或 delete 操作,默认会清空该 Mapper 的二级缓存。
    • 示例:
    <update id="updateUser">
        UPDATE users SET name = #{name} WHERE id = #{id}
    </update>
  5. 手动调用 clearCache() 方法

    • 可以通过 sqlSession.clearCache() 清空当前 SqlSession 的一级缓存和二级缓存。
  6. 缓存策略冲突

    • 如果多个 Mapper 文件共享同一个二级缓存,但它们的缓存策略(如 LRU、FIFO 等)不一致,可能导致缓存失效。
  7. 缓存超时

    • 如果设置了缓存的过期时间(通过 <cache> 标签的 eviction 属性),当缓存数据超过设定时间后会被清除。
    • 示例:
    <cache eviction="LRU" flushInterval="60000" /> <!-- 缓存每 60 秒刷新一次 -->
  8. 跨命名空间访问

    • 如果两个不同的 Mapper 文件共享同一个二级缓存,但在其中一个 Mapper 中发生了增删改操作,另一个 Mapper 的缓存也会被清空。
  9. 自定义缓存实现问题

    • 如果实现了自定义缓存(通过 <cache-ref> 或自定义 Cache 接口),但逻辑有问题,可能导致缓存失效。

三、总结

缓存类型失效情形
一级缓存

1. SqlSession 关闭或提交事务

2. 执行增删改操作

3. 手动调用 clearCache()

4. 查询条件不同

5. 查询间隔过长

二级缓存

1. 未启用二级缓存

2. useCache=false

3. flushCache=true

4. 执行增删改操作

5. 手动调用 clearCache()

6. 缓存策略冲突

7. 缓存超时

8. 跨命名空间访问

9. 自定义缓存实现问题

了解这些缓存失效的情形有助于更好地控制缓存行为,避免因缓存不一致导致的数据错误。

相关文章:

  • DeepSeek 给我一个 DeepSeekUI 页面
  • 基于Springboot学生宿舍水电信息管理系统【附源码】
  • 加班限制了进步
  • DVWA 靶场
  • 14.9 Auto-GPT 提示工程深度解析:设计具备自主决策能力的智能体大脑
  • CSS滤镜(filter)和混合模式(blend mode)的使用场景
  • 使用docker配置PostgreSQL
  • Java值传递,会影响原值的原因
  • vivado修改下载器下载速率
  • OpenCV(6):图像边缘检测
  • 如何在cursor上使用 deepseek 模型
  • 自用开发的商标和工作小工具!
  • 行业分析---对自动驾驶规控算法的思考
  • x-cmd mod | x theme (1) - 终端美化利器,一键切换终端主题,内置 120+ 种终端主题
  • SAP S4HANA Administration (Mark Mergaerts Bert Vanstechelman)
  • Scrum方法论指导下的Deepseek R1医疗AI部署开发
  • 公务员行测之类比推理-新手小白
  • 【愚公系列】《Python网络爬虫从入门到精通》022-Splash的爬虫应用
  • C语言(11)------------->while循环
  • XCP的标准会话应答例程
  • 国防部:中方愿与俄方不断增强两军关系良好发展势头
  • 特朗普中东行:“能源换科技”背后的权力博弈|907编辑部
  • 4台肺癌手术,2名“90后”患者,这届年轻人的肺怎么了?
  • 牛市早报|中方调整对美加征关税措施,五部门约谈外卖平台企业
  • 人民日报评外卖平台被约谈:摒弃恶性竞争,实现行业健康发展
  • 中国女足将于5月17日至6月2日赴美国集训并参加邀请赛