首页 > Java > Java面试题 > 正文

说一下 mybatis 的一级缓存和二级缓存?

幻夢星雲
发布: 2025-11-28 16:25:19
原创
716人浏览过
一级缓存失效包括SqlSession关闭、执行更新操作、手动清空缓存或查询条件变化;二级缓存需在全局配置中启用cacheEnabled,在Mapper中添加<cache>标签,并确保POJO实现Serializable接口。

说一下 mybatis 的一级缓存和二级缓存?

MyBatis的一级缓存是Session级别的,而二级缓存是namespace级别的。一级缓存默认开启,无需配置;二级缓存需要手动开启和配置。

MyBatis的缓存机制,是为了提高查询效率,减少数据库压力。一级缓存的存在,让同一个Session内,相同的查询语句可以直接从缓存中获取结果,避免重复查询数据库。而二级缓存,则允许跨Session共享缓存数据,进一步提升性能。

一级缓存失效的几种情况?

一级缓存是和SqlSession绑定的,它的生命周期与SqlSession一致。所以,SqlSession关闭时,一级缓存也就失效了。但除了SqlSession的生命周期,还有一些操作会导致一级缓存失效:

  • 执行任何更新操作(update、insert、delete):因为更新操作会修改数据库中的数据,为了保证数据的一致性,MyBatis会清空一级缓存。
  • 手动清空缓存:可以通过调用sqlSession.clearCache()方法手动清空一级缓存。
  • 不同的SqlSession:即使查询条件完全相同,不同的SqlSession也会创建自己的一级缓存,彼此之间互不影响。
  • 相同的SqlSession,但查询条件不同:虽然在同一个SqlSession中,但如果两次查询的查询条件不同,MyBatis会执行两次查询,并分别将结果缓存起来。

总之,一级缓存失效的核心原则是:任何可能导致数据不一致的操作,都会导致一级缓存失效。

二级缓存如何配置才能生效?

要让MyBatis的二级缓存生效,需要在多个地方进行配置。

  1. 开启二级缓存:在MyBatis的全局配置文件(通常是mybatis-config.xml)中,需要开启二级缓存。

    <configuration>
      <settings>
        <setting name="cacheEnabled" value="true"/>
      </settings>
      ...
    </configuration>
    登录后复制
  2. 在Mapper文件中配置cache元素:在需要使用二级缓存的Mapper文件中,添加<cache>元素。可以自定义缓存的配置,例如缓存的刷新间隔、缓存的大小等。

    <mapper namespace="com.example.mapper.UserMapper">
      <cache
          eviction="LRU"
          flushInterval="60000"
          size="1024"
          readOnly="true"/>
      ...
    </mapper>
    登录后复制
    • eviction:缓存回收策略,常见的有LRU(最近最少使用)、FIFO(先进先出)等。
    • flushInterval:缓存刷新间隔,单位是毫秒。如果设置为0,则表示不刷新。
    • size:缓存的大小,表示最多可以存储多少个对象。
    • readOnly:是否只读。如果设置为true,则表示缓存中的对象是只读的,不能被修改。
  3. POJO类需要实现Serializable接口:因为二级缓存可能会将对象序列化到磁盘上,所以需要确保POJO类实现了java.io.Serializable接口。

    ZBLibrary
    ZBLibrary

    ZBLibrary是一款Android快速开发框架。MVP 架构,提供一套开发标准(View,Data,Event)以及模板和工具类并规范代码。封装层级少,简单高效兼容性好。OKHttp 网络请求、Glide 图片加载、ZXing 二维码、沉浸状态栏、下载安装、自动缓存以及各种 Base、Demo、UI、Util 直接用。全新的手势,侧滑返回、全局右滑返回都 OUT 啦!用 BaseView,自

    ZBLibrary 0
    查看详情 ZBLibrary
  4. select语句需要配置useCache="true":默认情况下,select语句会使用二级缓存。如果不需要使用二级缓存,可以将useCache属性设置为false

  5. 更新操作需要配置flushCache="true":默认情况下,update、insert、delete语句会清空二级缓存。如果不需要清空二级缓存,可以将flushCache属性设置为false。但是,通常不建议这样做,因为可能会导致数据不一致。

配置完成后,MyBatis就会自动使用二级缓存来提高查询效率。

如何选择使用一级缓存还是二级缓存?

选择使用哪种缓存,或者同时使用两种缓存,取决于具体的应用场景和需求。

  • 一级缓存适用场景:适用于单个会话内需要频繁查询相同数据的场景。由于一级缓存的生命周期与SqlSession一致,因此在同一个会话内,可以避免重复查询数据库。
  • 二级缓存适用场景:适用于多个会话之间需要共享缓存数据的场景。例如,对于一些不经常变动的配置信息、字典数据等,可以使用二级缓存来提高查询效率。

一般来说,建议同时使用一级缓存和二级缓存。一级缓存可以提高单个会话内的查询效率,而二级缓存可以提高多个会话之间的查询效率。但是,需要注意的是,二级缓存可能会导致数据一致性问题,因此需要谨慎使用。

例如,一个电商网站的商品信息,可以考虑使用二级缓存。因为商品信息不经常变动,而且多个用户可能会查询相同的商品信息。但是,对于库存信息,则不适合使用二级缓存,因为库存信息是经常变动的,使用二级缓存可能会导致超卖等问题。

总而言之,选择使用哪种缓存,需要根据具体的应用场景和需求进行权衡。没有绝对的正确答案,只有最适合的解决方案。

以上就是说一下 mybatis 的一级缓存和二级缓存?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号