Mybatis的缓存机制

Mybatis的缓存机制

缓存

缓存就是将用户经常查询的数据的结果保存在内存当中,这样用户再次查询数据时就可以直接通过缓存获取数据,而不需要通过磁盘读取数据。

缓存的分类

Mybatis提供了一级缓存和二级缓存。

  • 一级缓存:一级缓存又叫本地缓存(默认开启,不允许关闭),用户保存用户在一次会话过程中查询的结果,用户一次会话中只能使用一个sqlsession
  • 二级缓存:二级缓存又叫全局缓存,二级缓存是对一个表的结果的一个存储,可以共享给所用针对这张表查询的用户。

Executor

在这里插入图片描述

执行器说明
SimpleExecutor最简单的执行器,根据对应的sql直接执行,不会做额外的操作
BatchExecutor通过批量操作来优化性能。执行批量更新时,由于内部有缓存的实现,使用完后需要调用flushStatements来清除缓存
ReuseExecutor可重用的执行器,重用的对象是Statement,也就是说该执行器会缓存同一个sql的Statement,省去Statement的重新创建,优化性能。内部的实现通过一个HashMap来维护Statement对象。由于当前Map只在该session中有效,所以使用完后需要调用flushStatement来清除Map。
CachingExecutor二级缓存使用的执行器。

一级缓存的原理

在这里插入图片描述

Mybatis使用一级缓存的流程:

  1. 用户发送指令到Executor
  2. Executor根据用户需要执行的语句生成MappedStatement
  3. Executor优先在LocalCache中查询是否有对应缓存。若有,则将缓存结果返回;若无,则从数据库中查询并获取数据并写入Local Cache

sqlsession提交时会清空本地缓存,防止读取脏数据。

一级缓存失效的原因

  • 同一个用户使用不同的sqlsession
  • 同一个sqlsession使用查询条件不同。
  • 在同一次事务中进行了更新操作。

一级缓存注意事项

  • Mybatis一级缓存的本质时一个没有容量限定的HashMap
  • MybatisSpring整合后进行mapper代理开发,不支持一级缓存。

二级缓存原理

在这里插入图片描述

二级缓存通过在用户与Excutor中添加一个CachingExecutor实现

二级缓存的使用

  1. 通过注解@CacheNamespace使用二级缓存。

    /*
    	eviction: 使用的缓存策略
    	flushInterval: 周期刷新频率(ms)
    	blocking: 请求时是否阻塞缓存
    	size: 缓存大小
    */
    @CacheNamespace(eviction = FifoCache.class,flushInterval = 3000,size = 512,blocking = false)
    
  2. 通过mapper.xml文件的cache标签配置二级缓存。

    <!--readOnly: 是否只读,若配置读写,则需要对应实体类能够序列化-->
    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
    

Cache类

在这里插入图片描述

Cache类型说明
LruCache使用最近最久未使用算法淘汰缓存。
FifoCache使用先进先出淘汰缓存。
SynchronizedCache同步Cache,实现比较简单,注解使用synchronized修饰方法。
LoggingCache日志功能,装饰类,用于记录缓存的命中率,如果开启了DEBUG模式,则会输出命中率日志。
SerializedCache序列化功能,将值序列化后存入缓存中,该功能用户缓存返回示例的Cope,用于保存线程安全。
PerpetualCache最基础的缓存类,底层实现比较简单,直接使用HashMap
SoftCache软引用回收缓存。
WeakCache弱引用回收缓存。

在xml文件中的、、等标签中可以设置flushCache选择是否刷新缓存,useCache选择是否使用缓存。

<select flushCache="true"  useCache="true">
    {sql}查询语句
</select>

二级缓存失效的原因

xml

{sql}查询语句


### 二级缓存失效的原因

`flushCache`属性在增删查改中的使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值