一、前言

二级缓存位置
用到的设计模式:装饰器+责任链
image.pngimage.png

二、二级缓存的结构

下图中,一个会话对应多个暂存区(几个缓存就有几个暂存区),当commit之后,暂存区中的数据会被刷到缓存区。

  • 有多少个缓存区取决于用了多少个mapper
  • 相同颜色表示相同的缓存值
  • 会话关闭之后,暂存区消失,但是缓存区永远存在。

image.png
下图中的transactionChaches就是二级缓存
image.png

三、整个二级缓存的流程图

image.png

四、源码剖析

暂存区:private final Map<_Object, Object> _entriesToAddOnCommit
缓存区:private final Cache delegate

1、二级缓存存入位置

https://www.yuque.com/wangchao-volk4/fdw9ek/yni5df#WPJTW

2、清除

更新的时候,首先做下更新的 标记,然后清除暂存区的内容,等待commit之后,才会清除缓存区的内容。
这样做是为了避免脏读,即:更新还没commit时,读取到了暂存区的内容,查询逻辑会根据 标记判断有没有更新。
标记就是 clearOnCommit
image.png
image.pngimage.png
private final Map<_Object, Object> _entriesToAddOnCommit;
image.png
private final Cache delegate;
commit会清除缓存区内容,并将暂存区的缓存刷入缓存区
image.png
image.png