MyBatis第六讲:MyBatis缓存

MyBatis的一级缓存是基于SqlSession的局部缓存,而二级缓存则是全局的,可跨SqlSession共享。一级缓存默认开启,但不同SqlSession无法共享数据。二级缓存需在MyBatis配置和Mapper中开启,并可配置缓存策略、刷新间隔和大小等。查询时可通过useCache属性决定是否使用缓存。
摘要由CSDN通过智能技术生成

八、MyBatis缓存机制

MyBatis 提供了一级缓存和二级缓存的支持。默认情况下,MyBatis 只开启一级缓存。

8、1MyBatis一级缓存

一级缓存是基于MyBatis自带的 HashMap 本地缓存,作用范围为 SqlSession 域内。当刷新或者关闭之后,该 SqlSession 中所有的缓存就会被清空。 在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession 会取出当前缓存的数据,而不会再次发送 SQL 到数据库。但是由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。

8、2MyBatis二级缓存

二级缓存是全局缓存,作用域超出 SqlSession 范围之外,缓存在 SqlSessionFactory 层面上能够提供给各个 SqlSession 共享。

8、2、1配置二级缓存

在MyBatis核心配置文件中设置二级缓存

<settings>
  <setting name="cacheEnabled" value="true"/>
</settings>
8、2、2在mapper中设置二级缓存

在 mapper 文件中设置缓存,默认不开启缓存。需要注意的是,二级缓存的作用域是针对 mapper 的 namescape 而言,即只有再次在 namescape 内的查询才能共享这个缓存.

<!--
在mapper配置文件中加入cache标签,用来设置二级缓存
eviction属性:设置缓存回收策略【
    LRU:使用较少,移除最长时间不用的对象;
    FIFO:先进先出,按对象进入缓存的顺序来移除它们(常用);
    SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象;
    WEAK:弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象。
】
flushInterval:设置刷新间隔时间,单位为毫秒
size:引用数目,正整数,代表缓存最多可以存储多少个对象,不宜设置过大
readOnly:只读,默认值为 false,意味着缓存数据只能读取而不能修改
-->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
8、2、3在查询中设置二级缓存

在 mapper 文件配置支持缓存后,如果需要对个别查询进行调整,可以单独设置缓存

<!--设置useCache属性,表示单独查询使用缓存-->
<select id="findAll" resultMap="bookType" useCache="true">
  select b.id,b.name,b.price,l.lid,l.userId,l.bookId from book b left join log l on b.id=l.bookId where b.id=1
</select>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值