You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

16 lines
2.2 KiB

Mybatis提供了两种缓存它们分别为一级缓存和二级缓存。
- 一级缓存指的是SqlSession对象级别的缓存。当我们执行查询后查询的结果会同时存入到SqlSession为我们提供的一块区域中该区域的结构是一个HashMap**不同的SqlSession的缓存区域是互相不受影响的**。当我们再次查询同样的数据Mybatis会先去SqlSession的缓存区域中查询是否有有的话直接拿出来用没有则去数据库查询。当SqlSession对象消失后被flush或closeMybatis的一级缓存也就消失了。一级缓存默认是启动的而且是一直存在的
- 二级缓存指的是Mapper对象Namspace级别的缓存也可以说是SqlSessionFactory对象级别的缓存由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。多个SqlSession去操作同一个Mapper的sql语句多个SqlSession可以共用二级缓存二级缓存是跨SqlSession的。二级缓存Mybatis默认是关闭的需要自己去手动配置开启或可以自己选择用哪个厂家的缓存来作为二级缓存
# 一级缓存
一级缓存是SqlSession对象级别的缓存Mybatis会在SqlSession内部维护一个HashMap用于存储缓存Key为hashcode+sqlid+sqlvalue则为查询的结果集当执行查询时会先从缓存区域查找如果存在则直接返回数据否则从数据库查询并将结果集写入缓存区。
## 一级缓存的清空
以下的两个操作会导致一级缓存的清空:
1. 执行了insert、update、delete的sql语句又或者只执行了commit操作都会导致一级缓存失效。
添加、修改删除操作不管有没有成功只要你执行了增删改的SQL缓存都会清空即使没有通过commit方法提交而二级缓存必须通过commit方法提交才能清空缓存因为二级缓存必须要在sqlSession关闭或者提交(commit)才能生效。
![[1745215-20201120153019722-1747791924.png]]
2. 手动清空通过sqlSession.clearCache
## 一级缓存的问题
必须通过sqlSession进行更新如果手动执行sql的话mybatis无法感知因此一般没人用mybatis缓存。