mybatis_cache系列
建议按顺序阅读
前言
本文主要阐述mybatis一级缓存与二级缓存区别。
纯理论简述,将不会有代码coding。建议阅读上述两文后再阅读
大白话简述什么是一级缓存?
首先一级缓存我们要知道是mybatis为我们默认开启的。
在客户端使用mybatis与数据库交互时,mybatis会将查询结果存到一级缓存中,待下次用同一个会话再执行相同查询操作时候就直接从缓存中获取数据返回,从而减轻数据库的压力,也给系统提高响应速度。
大白话简述什么是二级缓存?
还是一样来说一下开启状态,二级缓存默认是没有开启的,要使用的话,需要我们手动配置。
同理,二级缓存也是在客户端与数据库交互时,mybatis会将查询结果存到二级缓存中,待下次再次操作同一个xml文件执行相同的查询操作时候就直接从缓存中获取数据返回,从而减轻数据库的压力,也给系统提高响应速度。
缓存命中流程图
一级缓存命中流程
二级缓存命中流程
通过上面两幅图可以看到如果二级缓存有数据的话,则是优先命中二级缓存,其次才是命中一级缓存。
如果两个缓存都没有数据,最后才去查询数据库
影响缓存命中规则的因素
一级缓存与二级缓存的命中规则完全一致,它们都是使用相同计算规则产生的cacheKey来作为各自的缓存key值。
所以影响这个cacheKey的因素就是影响缓存的命中因素,所以他们两者的命中规则因素是一致的。
找了一下生成cacheKey的mybatis源码,简单解释一下,代码如下:
从上至下红框分别代表了cacheKey的组成部分
- statementId(xml文件的具体sql语句的标签id)
- offset(mybatis分页参数)
- limit(mybatis分页参数)
- sql(执行的sql语句)
- value(执行sql语句接收的所有逻辑参数)
- environment(mybatis的sqlsessionFactory环境)
上述几点就是合起来就组成了cacheKey,mybatis就是根据这个key从缓存中get、set
缓存生命周期
生命周期顾名思义就是缓存何时创建,缓存的作用域,缓存何时会销毁,以及遇到什么情况会销毁
何时创建
一级缓存
在同一个sqlsession内,执行一条查询sql,mybatis就会把数据立即存入一级缓存内,待下次继续执行相同sql时则从缓存中获取。
二级缓存
在同一个sqlsessionFatory内,执行一条查询sql,mybatis就会把数据立即存入待存入二级缓存的HashMap中,当本次sqlsession执行close/commit时,源码将调用二级缓存的实现执行commit函数,将待存入二级缓存的HashMap进行遍历后将数据都存入二级缓存中。
大白话就是:查询到的数据,除非执行了close/commit,否则不会将数据存入二级缓存。
作用范围:sqlsessionFatory > sqlsessioon;一个sqlsessionFatory可以open多个sqlsession
作用范围
缓存的作用范围,也就是超出这个范围即无法命中缓存
相同因素
同一个xml文件
一级缓存
- 同一个xml文件
- 同一个sqlsession
- 同一个事务
二级缓存
- 同一个xml文件
- 同一个sqlsessionFatory
可以看到二级缓存的作用域是大于一级缓存的
何时销毁,以及什么情况会销毁
相同因素
- session回滚(二级缓存需特别说明)
- 执行update/insert/delete语句
一级缓存
- session关闭
- session提交
- session回滚
- 执行update/insert/delete语句
- 手动销毁
二级缓存
- session回滚
- 执行update/insert/delete语句
session回滚
一级缓存
将销毁一级缓存里的所有数据
二级缓存
将销毁待存入二级缓存的HashMap的所有数据,这些数据实际还不算是二级缓存的数据。