Mybatis的一级缓存和二级缓存
一级缓存
特性:
-
默认就开启了,也可以关闭一级缓存 localCacheScope=STATEMENT
-
作用域:是基于sqlSession(默认),一次数据库操作会话。
-
缓存默认实现类PerpetualCache ,使用map进行存储的
-
查询完就会进行存储
-
先从二级缓存中获取,再从一级缓存中获取
key==> sqlid+sql
失效情况:
-
不同的sqlSession会使一级缓存失效
-
同一个SqlSession,但是查询语句不一样
- 同一个SqlSession,查询语句一样,期间执行增删改操作
- 同一个SqlSession,查询语句一样,执行手动清除缓存
二级缓存
特性:
-
默认开启了,没有实现
-
作用域:基于全局范围,应用级别。
-
缓存默认实现类PerpetualCache ,使用map进行存储的但是二级缓存根据不同的mapper命名空间多包了一层
map : org.apache.ibatis.session.Configuration#caches key:mapper命名空间 value:erpetualCache.map
key==> sqlid+sql
-
事务提交的时候(sqlSession关闭)
-
先从二级缓存中获取,再从一级缓存中获取
实现:
- 开启二级缓存
- 在需要使用到二级缓存的映射文件中加入
,基于Mapper映射文件来实现缓存的,基于Mapper映射文件的命名空间来存储的 - 在需要使用到二级缓存的javaBean中实现序列化接口implements Serializable
配置成功就会出现缓存命中率 同一个sqlId: 从缓存中拿出的次数/查询总次数
失效:
- 同一个命名空间进行了增删改的操作,会导致二级缓存失效
- 但是如果不想失效:可以将SQL的flushCache 这是为false,但是要慎重设置,因为会造成数据脏读问题,除非你能保证查询的数据永远不会执行增删改
- 让查询不缓存数据到二级缓存中useCache="false"
- 如果希望其他mapper映射文件的命名空间执行了增删改清空另外的命名空间就可以设置:
我成功因为我志在成功
浙公网安备 33010602011771号