Mybatis二级缓存详解(原理配置及应用场景)

Mybatis二级缓存详解(原理配置及应用场景)-mikechen

什么是Mybatis二级缓存

缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存可以避免频繁与数据库进行交互,从而提高查询响应速度。

MyBatis 提供了对缓存的支持,分为一级缓存和二级缓存,如下图所示:

Mybatis二级缓存详解(原理配置及应用场景)-mikechen

一级缓存:SqlSession级别的缓存,缓存的数据只在SqlSession内有效。

二级缓存:mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的,二级缓存需要我们手动开启。

 

为什么需要Mybatis二级缓存?

MyBatis 一级缓存最大的共享范围就是一个SqlSession内部,那么如果多个 SqlSession 需要共享缓存,则需要开启二级缓存。

 

Mybatis二级缓存的配置?

1.首先在mybatis配置文件的节点中配置整体开启二级缓存:

<settings>
    <!-- 开启日志 -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <!-- 开启二级缓存(整体开启) -->
    <setting name="cacheEnabled" value="true"/>
</settings>

2.然后为具体的Mapper映射文件的命名空间进行二级缓存的具体配置:

<!-- cacahe节点:配置当前命名空间下mapper的缓存 -->
<cache eviction= "LRU" flushInterval= "100000" readOnly= "true" size= "1024"/>

3.使缓存对象的实体类实现序列化接口(Serializable),使其能够被序列化和反序列化。

 

Mybatis二级缓存的实现原理

开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在 CachingExecutor 进行二级缓存的查询,具体的工作流程如下所示。

Mybatis二级缓存详解(原理配置及应用场景)-mikechen

二级缓存开启后,同一个 namespace 下的所有操作语句,都影响着同一个 Cache,即二级缓存被多个 SqlSession 共享,是一个全局的变量。

当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

 

Mybatis二级缓存的应用场景?

对查询频率高,变化频率低的数据建议使用二级缓存。

对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度。

业务场景比如:耗时较高的统计分析sql、电话账单查询sql等,通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔即可。

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法