MyBatis缓存机制

MyBatis缓存机制

本文是《聊聊MyBatis缓存机制》一文的读后感

MyBatis的缓存机制和MySQL Query Cache一样,都属于很鸡肋的功能,不建议开启
写本文也只是为了拓宽视野。


(一)一级缓存

在一次数据库会话(session)中,可能执行多次相同的SELECT语句,MyBatis提供了一级缓存进行优化:如果是相同的SELECT语句,优先命中一级缓存


每个SqlSession中持有Executor,每个Executor中有自己的LocalCache,当用户发起查询时MyBatis会根据执行的语句生成MappedStatement,然后查询LocalCache,如果命中的话直接返回,否则查库后更新到LocalCache

配置

  1. <setting name="localCacheScope" value="SESSION"/>默认级别,在一个MyBatis session中执行的所有语句都会共享一个LocalCache缓存

    多个session的情况下存在脏数据

  2. <setting name="localCacheScope" value="STATEMENT"/>每个语句有自己单独的LocalCache缓存

注意

  1. 对数据库进行了修改后,LocalCache会失效

    是不是想起了时代的眼泪 —— MySQL Query Cache

缓存SELECT语句,一旦库进行了修改则失效,由于存在锁表的风险而被淘汰

  1. 假设有两个sessionsession 1建立了一级缓存,此时如果session 2修改了库,session 1并不会删除它的LocalCache,而是会返回脏数据

    解决措施:二级缓存


(二)二级缓存

为了解决一级缓存多个session之间缓存不共享的问题,MyBatis提供了二级缓存。开启二级缓存后,会使用CachingExecutor修饰Executor在进入一级缓存的查询流程前,先在CachingExecutor进行二级缓存的查询

即:二级缓存 -> 一级缓存 -> DB

配置

  1. 开启二级缓存:<setting name="cacheEnabled" value="true"/>

  2. 声明二级缓存:<cache/>

    (1)type:类型;
    (2)eviction:内存回收策略,如FIFO/LRU
    (3)flushInterval:自动刷新缓存间隔(ms);
    (4)size:最多缓存的对象个数;
    (5)readOnly:只读;
    (6)blocking若缓存中找不到对应的key,是否一致阻塞直到有数据进入缓存

  3. 引用其他命名空间的二级缓存:<cache-ref namespace="mapper.BabyMapper"/>

注意

  1. MyBatis在多表查询时极大可能出现脏数据
  2. 建议关闭MyBatis的缓存机制,当作单纯的ORM框架使用。
-------------本文结束感谢您的阅读-------------

本文标题:MyBatis缓存机制

文章作者:DragonBaby308

发布时间:2019年11月07日 - 22:31

最后更新:2019年11月07日 - 22:32

原始链接:http://www.dragonbaby308.com/MyBatis/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%