Mybatis的缓存使用

本文介绍了Mybatis的一级缓存和二级缓存的原理及应用。一级缓存基于SqlSession,二级缓存基于namespace,实现了全局缓存。讨论了缓存失效的情况,并详细解释了二级缓存的配置,包括开启、缓存类选择、回收策略、刷新间隔、引用数目和只读设置。同时,提到了第三方缓存如Redis与Mybatis的整合方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于什么是缓存,为什么要有缓存之类的问题这里不做阐述,本文仅对mybatis缓存在实际中的应用进行分析。

1.一级缓存:本地缓存,sqlsession级别的一个缓存,基于map实现,是一直开启的
·一级缓存失效的四种情况:
|-sqlsession不同
|-sqlsession相同,语句不同
|-sqlsession相同,但是两次查询之间进行了增删改操作
|-sqlsession相同,但是中间手动清除了缓存sqlsession.clearCache();



2.二级缓存:全局缓存,基于namespace级别的缓存
·工作原理:一个会话查询一个数据,这个数据会被放在当前会话的一级缓存中,如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话信息会到二级缓存中查找信息,不同的namespace下的方法查出的数据会放在各自对应的缓存中
·使用:
|-开启全局二级缓存设置,settings中:
在这里插入图片描述
|-对应的mapper的namespace中配置cache
在这里插入图片描述
|-我们的POJO类必须实现序列化接口Serialize

二级缓存的常用参数:
1.eviction:缓冲的回收策略,默认是LRU

 · LRU – 最近最少使用的:移除最长时间不被使用的对象。
  ·FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  ·SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
  ·WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

2.flushInterval(刷新间隔):可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
3.size(引用数目):可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的 可用内存资源数目。默认值是 1024。
4.readOnly(只读):属性可以被设置为 true 或 false。只读(true)的缓存会给所有调用者返回缓存对象的引用。因此这些对象不能被修改。这提供了很重要的性能优势,但是不安全。可读写(false)的缓存 会返回缓存对象的拷贝(通过序列化) 。这会慢一些,但是安全。默认是false。
5.type:指定自定义缓存的具体路径,实现Cache接口的类,第三方缓存整合mybatis就是实现这个接口

注意:
1.每个select上的useCache属性影响的是二级缓存
2.每个增删改标签的flashCache默认都是true,所以操作过后一级缓存和二级缓存都会清空;查询标签的flashCache是默认是false,所以操作完成后不会清空缓存,若置为true则每次查询后会清空缓存,即不使用缓存
3.clearCache()方法影响的是一级缓存



3.使用第三方缓存框架,以redis作为mybatis的二级缓存为例:
·下载对应的包,https://github.com/mybatis 下有各种缓存整合包,对应各自依赖
·找到对应的redis的maven依赖
·在需要使用二级缓存的namespace中指定缓存的类型:
<cache type="org.mybatis.caches.redis.RedisCache" />
·开启redis服务器端,执行操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值