一、前言
二、二级缓存的结构
下图中,一个会话对应多个暂存区(几个缓存就有几个暂存区),当commit之后,暂存区中的数据会被刷到缓存区。
- 有多少个缓存区取决于用了多少个mapper
- 相同颜色表示相同的缓存值
- 会话关闭之后,暂存区消失,但是缓存区永远存在。
三、整个二级缓存的流程图
四、源码剖析
暂存区:private final Map<_Object, Object> _entriesToAddOnCommit
缓存区:private final Cache delegate
1、二级缓存存入位置
https://www.yuque.com/wangchao-volk4/fdw9ek/yni5df#WPJTW
2、清除
更新的时候,首先做下更新的 标记,然后清除暂存区的内容,等待commit之后,才会清除缓存区的内容。
这样做是为了避免脏读,即:更新还没commit时,读取到了暂存区的内容,查询逻辑会根据 标记判断有没有更新。
标记就是 clearOnCommit
private final Map<_Object, Object> _entriesToAddOnCommit;
private final Cache delegate;
commit会清除缓存区内容,并将暂存区的缓存刷入缓存区