1. mybatis的2级缓存

|

1.1 一级缓存(本地缓存):

与数据库统一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库。
1653837639(1).png
一级缓存是sqlSession的级别的一个map,即一次session会话;
一级缓存失效的情况:
如果没有使用到当前一级缓存的情况,效果就是,还需要向数据库发送一次sql查询;可能的情况如下:
1. case1: sqlSession变了(未关闭),导致重新查询;第一个session没有关闭,就会重新发送sql查询;
1. case2: sqlSession相同,但查询条件不同,eg: 查1号员工,再查3号;
1. case3: 同一个sqlSession,但2次查询中间有了增删改;
1. case4:sqlSession相同,但手动清除了缓存,openSession.clearCatch();
| | —- | |

1.2 二级缓存


1. 是全局级别的缓存,基于nameSpace, 每个xml都有一个名称空间,一个名称空间就是一个二级缓存;
1. 工作机制:
1. 一个会话,会查询一个数据,这个数据就会被放在当前会话的一级缓存中;只要会话没关,再次查询,就回去一级缓存中查询;
1. 如果会话关闭了,对应的一级缓存就会被保存到二级缓存中;新的会话查询信息就会去查询二级缓存,不会再发送sql请求。
1. 一个sqlSession,既有通过employeeMapper.xml查的employee对象,
又有通过departmentMapper.xml查的department对象;
这两个不同nameSpace查询的数据会被保存在自己对应的map中(即缓存中)。
3. 二级缓存的使用步骤:
1. 开启全局二级缓存配置:在mybatis_conf.xml的settings 中, ; 如果没有配置二级缓存,则该mapper不会存在二级缓存中。
1. 在每个mapper.xml中配置使用二级缓存:


3. 我们的javaBean(POJO)需要实现序列化接口;因为readOnly有时是false


4. 与缓存有关的设置:
1. 整个setting级别的:cachenabled=true; if =false—-》关闭二级缓存,一级缓存一直可以使用;
1. 单个select标签级别的:每个select标签都有useCache=true——>false: 二级缓存不可用,一级缓存都可以用,eg:
```xml

```
3. 每个增删改标签:flushcache=true, 增删改完成后就会清除缓存;——》每次查询之前都会清除缓存,*一级二级缓存都会清除,所以缓存是不存在的
3. 在方法中,sqlSession.clearCatch()——>只会清除一级缓存,不会清除二级缓存
image.png
mybatis的Cache接口及实现:
image.png
|

2. ehcache 的使用

cacheref.png