MyBatis缓存机制

MyBatis缓存配置

为什么要使用缓存呢??
因为使用缓存可以使应用更快的获取数据,避免频繁的数据库交互,尤其是在查询越多、缓存命中率越高的情况瞎,使用缓存的作用就越明显,MyBatis作为持久化框架,提供了非常强大的查询缓存特性,可以非常方便的配置和定制使用。
mybatis提供一级缓存和二级缓存

一级缓存

一级缓存是sqlsession级别的缓存,系统默认开启。
SQLSession实例对象下存在一个数据结构(HashMap)。不同的sqlSession之间的缓存是相互隔离的,互不影响的。
缓存的执行过程:

  1. 调用sqlsession的一个实例。SQLSession.selectOne( )
  2. 用户发起查询操作,先通过执行器来查询操作是否有缓存,如果有缓存数据,直接返回查询结果;若没有则直接查询数据库。将查询结果记录到缓存中,并返回结果。

例:对同一个sqlsession实例,第一次查询后记录缓存,未对同一个用户进行变更操作(insert、update、delete)后,则再次查询时直接查询缓存,不必再次访问数据库。

缓存的添加及删除时间:

添加缓存:进行查询操作(select)时,当缓存没有命中时,先查询数据库,通过查询结果添加缓存。

删除时机:当数据库发生变更操作(insert 、updata 、delete)操作时,会将缓存数据删除。–目的时避免缓存数据和数据库数据不一致,防止读取脏数据。

二级缓存

二级缓存是mapper级别的缓存,可以理解为存在于SqlSessionFactory的生命周期种,默认不开启,需在mybatis.xml的全局配置参数中手动打开
配置二级缓存
1.在mybatis-config.xml中添加如下代码:

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

2.在Usermapper.xml中开启二级缓存

<mapper>
    <cache eviction="LRU" flushInterval="1000" />
</mapper>

cache下还有一些必须要强调的属性
size:引用数目,默认值是1024。
eviction属性:代表缓存的回收策略
flushInterval属性:刷新的间隔实现- -毫秒形式,默认不设置。
mybatis提供的回收策略有:

  • LRU:最近最少使用,一般长时间不用的对象。☞默认值
  • FIFO:先进先出策略,按照对象的进入缓存顺序处理
  • SOFT:软引用:移除基于垃圾回收器状态和软引用规则的对象
  • weak:弱引用:更积极地移除基于垃圾收集器和弱引用规则地对象。

也可以针对单个标签开启二级缓存
用到属性useCache。

<select id="getAllMe" useCache="true" resultType="me">

重要的是

  1. 返回映射的对象类必须实现序列化!!!(implements Serializable)

  2. 二级缓存需要将提交的SQLSession实例关闭掉,查询结果才能进入到缓存sqlSession.close();

一级缓存和二级缓存的区别:

二级缓存范围更大,多个SQLSession实例可以共享一个二级缓存区域,每一个namespace的mapper都是一个二级缓存。每一个SQLSession都是一个一级缓存。

看个图理解一哈。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值