Mybatis源码之路

Mybaits 缓存

2020-09-04  本文已影响0人  93张先生

一级缓存

数据库是比较珍贵的资源,很容易成为整个系统的瓶颈,减少对数据库的直接访问 。使用缓存是一种比较有效的优化手段,使用缓存可以减少应用系统与数据库的网络交互、减少数据库访问次数、降低数据库的负担、降低重复创建和销毁对象等 系列开销,从而提高整个系统的性能。从另一方面来看,当数据库意外岩机时,缓存中保存的数据可以继续支持应用程序中的部分展示的功能,提高系统的可用性。

MyBatis 作为功能强大的 ORM 框架,提供了一级缓存和二级缓存。

一级缓存是会话级别的缓存,在 MyBatis 中每创建一个 SqlSession 对象,就表示开启一次数据库会话。一级缓存是默认开启的。

SqlSession 是通过 Executor 来实现缓存的。Executor 创建一个缓存对象。
缓存的生命周期和 SqlSession 的生命周期相同,也就是和 Executor 对象的生命周期相同。当调用 Executor 的 close() 方法,一级缓存就会被清空。当调用 executor,update() 对象,缓存的也会被清空。

一级缓存的管理

executor 执行 select() 查询,使用缓存过程。


image.png

二级缓存(Global Second Cache)

特征

开启二级缓存

<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>
<cache readOnly="true"/>
<cache-ref namespace="org.apache.ibatis.domain.blog.mappers.BlogMapper"/>
<select id="selectWithOptions" resultType="org.apache.ibatis.domain.blog.Author" flushCache="false" useCache="false">
   select * from author
</select>

一级缓存和二级缓存的关系

image.png

缓存查询流程

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

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

image.png

自定义二级缓存实现

使用自定义缓存,修改 <cache> 标签的 type 类型

<cache type="com.domain.something.MyCustomCache"/>
上一篇 下一篇

猜你喜欢

热点阅读