MyBatis的一级、二级缓存

一级缓存

  • 定义与作用域:也叫本地缓存,是 SqlSession 级别的缓存。即在同一个 SqlSession 与数据库交互的过程中,查询到的数据会放在本地缓存里 。不同 SqlSession 间的缓存相互独立。
  • 工作原理 :当发起查询请求时,SqlSession 先检查缓存中是否有对应数据,有则直接读取;没有就从数据库查询,再将查询结果存入一级缓存。不过,若 SqlSession 执行了增删改(commit 操作),为避免脏读,会清空缓存。
  • 特点:默认开启,无需额外配置;缓存生命周期与 SqlSession 一致,SqlSession 关闭或提交事务后,缓存可能失效;作用范围小,仅在当前 SqlSession 内有效。

二级缓存

  • 定义与作用域:也叫全局缓存,是基于 namespace 级别的缓存,一个 namespace 对应一个二级缓存。多个 SqlSession 操作同一个 Mapper(相同 namespace)的 sql 语句时,可共用二级缓存,实现了跨 SqlSession 的缓存 。
  • 工作原理:当一个 SqlSession 关闭后,该会话一级缓存中的数据会被放入二级缓存。后续新的 SqlSession 查询相同数据,若二级缓存存在,就直接获取 。
  • 开启方式
    • mybatis-config.xml配置文件中配置<setting name="cacheEnabled" value="true"/>开启全局缓存。
    • 在对应的 Mapper 映射文件中添加<cache/>标签。
    • 使使用二级缓存的 POJO 类实现Serializable接口,以便缓存数据能序列化和反序列化。
  • 特点:需手动开启和配置;缓存作用范围更广,能在多个 SqlSession 间共享;可自定义实现cache接口来拓展缓存功能,如使用第三方缓存框架(如 Ehcache)。

两者区别

  • 作用域:一级缓存作用域是 SqlSession,二级缓存是 namespace(通常对应 Mapper) 。
  • 开启方式:一级缓存默认开启,二级缓存需手动配置开启。
  • 缓存生命周期:一级缓存随 SqlSession 的创建而存在,关闭或提交事务可能清空;二级缓存生命周期更长,只要应用不重启或未清空缓存,数据就可能一直存在。
  • 数据共享:一级缓存仅在当前 SqlSession 内共享数据,二级缓存能在多个 SqlSession 间共享。

通常,在查询多、增删改少,且用户对查询结果实时性要求不高的场景中,可利用 MyBatis 二级缓存减少数据库访问,提升访问速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值