有关于mybatis缓存笔记 摘抄于图灵学院鲁班大师笔记
- 一级缓存:在同一次查询会话中如果出现相同的语句及参数,就会从缓存中取出不在走数据库查询。1级缓存只能作用于查询会话中 所以也叫做会话缓存。在同一次查询会话中如果出现相同的语句及参数,就会从缓存中取出不在走数据库查询。1级缓存只能作用于查询会话中 所以也叫做会话缓存。在 一级缓存默认开启,在同一个会话中执行增删改会清除一级缓存。
- 一级缓存使用场景:订单表与会员表是存在一对多的关系 为了尽可能减少join 查询,进行了分阶段查询,即先查询出订单表,在根据member_id 字段查询出会员表,最后进行数据整合 。如果订单表中存在重复的member_id,就会出现很多没必要的重复查询。针对这种情况myBatis 通过1缓存来实现,在同一次查询会话中如果出现相同的语句及参数,就会从缓存中取出不在走数据库查询。1级缓存只能作用于查询会话中 所以也叫做会话缓存。
- 一级缓存的使用条件:
- 必须是相同的SQL和参数
- 必须是相同的会话
- 必须是相同的namespace 即同一个mapper
- 必须是相同的statement 即同一个mapper 接口中的同一个方法
- 查询语句中间没有执行session.clearCache() 方法
- 查询语句中间没有执行 insert update delete 方法(无论变动记录是否与 缓存数据有无关系)
二级缓存:没啥卵用emmmm(一般项目中都不使用二级缓存,坑太多)
- 二级缓存使用场景:业务系统中存在很多的静态数据如,字典表、菜单表、权限表等,这些数据的特性是不会轻易修改但又是查询的热点数据。一级缓存针对的是同一个会话当中相同SQL,并不适合这情热点数据的缓存场景。为了解决这个问题引入了二级缓存,它脱离于会话之外。
@CacheNamespace()
- 属性说明:
@CacheNamespace(
implementation = PerpetualCache.class, // 缓存实现 Cache接口 实现类
eviction = LruCache.class,// 缓存算法
flushInterval = 60000, // 刷新间隔时间 毫秒
size = 1024, // 最大缓存引用对象
readWrite = true, // 是否可写
blocking = false // 是否阻塞
)
- 2级缓存使用条件:
- 当会话提交或关闭之后才会填充二级缓存
- 必须是在同一个命名空间之下
- 必须是相同的statement 即同一个mapper 接口中的同一个方法
- 必须是相同的SQL语句和参数
- 如果readWrite=true ,实体对像必须实现Serializable 接口
- 2级缓存清除条件:
- xml中配置的update 不能清空 @CacheNamespace 中的缓存数据
- 只有修改会话提交之后 才会执行清空操作
- 任何一种增删改操作 都会清空整个namespace 中的缓存