Mybatis缓存机制学习笔记
一、介绍
- Mybatis包含一个非常强大的查询缓存机制,它可以非常方便地配置和定制,缓存可以极大提升查询效率
- Mybatis默认包含两级缓存
- 一级缓存(本地缓存)和二级缓存(全局缓存)
- 1、默认情况下,只有一级缓存开启
- 2、二级缓存需要手动开启和配置
- 3、为了提高拓展性。Mybatis定义了缓存接口Cache,我们可以通过实现Cache接口来定义二级缓存
- 一级缓存(本地缓存)和二级缓存(全局缓存)
二、一级缓存
2.1 介绍
- 一级缓存(本地缓存),也被称为sqlSession级别的缓存,一级缓存是一致开启的无法关闭。
- 在与数据库同一次会话期间,查询到的数据会放在本地缓存中
- 以后如果需要获取相同的数据,会支架从缓存中拿,没必要再去查询数据库
2.2 演示实例
- 前期准备:
- 为了能够更好展现缓存的效果,要导入Mybatis下的log4j-1.2.17.jar日志包
- 并把日志包的配置文件log4j.xml放在src目录下
1 | 日志包配置文件 |
- 测试:
1 | 测试方法 |
- 测试结果分析:
- 在测试方法类,共执行了两次sql语句,但是想数据库发送语句只出现了一次
- 而第二次查询并没有发送sql语句
- 证明了是直接使用缓存,发现缓存有此数据,于是直接拿来使用
2.3 不能使用一级缓存情况
- (1)sqlSession改变了,不是同一个sqlSession
- (2)sqlSession一样,但查询条件不一样
- (3)sqlSession一样,但在两次查询期间,执行了增删改的操作
- (4)sqlSession一样,被手动清除掉缓存,执行
openSession.clearCache();
方法
三、二级缓存
3.1 介绍
- 二级缓存(全局缓存):基于namespqce级别的缓存
- 一个名称空间对应一个二级缓存
- 工作机制:
- (1)一个会话,查询一条数据。这条数据就会放在当前会话的以及缓存中,即在一级缓存
- (2)如果会话关闭;一级缓存中的数据会被保存在二级缓存中;新的会话查询信息,就可以查找二级缓存信息
- 不同namespace(映射文件)查询的数据会在放在自己对应的缓存中(map中)
2.2 开启步骤
- 开启二级缓存步骤
- (1)在全局配置文件中设置
<setting name="cacheEnabled" value="true"/>
:开启二级缓存
1 | 全局配置文件 |
- (2)去每个mapper.xml(映射文件)中配置使用二级缓存
- 在
<mapper>
标签下使用<cache></cache>
开启
- 在
1 | 映射文件 |
- (3)查询封装的JavaBean实现序列化/反序列化接口
public class Xxxx implements Serializable
1 | JavaBean |
3.3 演示实例
1 | 测试方法 |
- 结果分析
- 和一级缓存分析一样,只是向数据库发送了一次sql语句
3.4 和缓存有关的设置
- (1)全局配置文件:
cacheEnabled="true"/"false"
,开启/关闭二级缓存
- (2)映射文件select标签:
useCache="true"/"fasle"
,使用/不使用二级缓存,默认true
- (3)每个增删改标签都有:
flushCache="true"/"false"
,是否清除缓存,一二级都会被清空,默认true- 查询标签也有,默认为fasle,清空缓存对于查询没有意义,一般不修改
- (4)
openSession.clearCache();
手动清除缓存,只会清掉一级缓存,不影响二级缓存
- (5)全局配置文件:
localCacheScope="SESSION"/"STATEMENT"
本地缓存作用域(一级缓存作用域)SESSION
:缓存保存在当前会话STATEMENT
:可以禁用一级缓存
四、整合Ehcache缓存框架
4.1 自定义缓存介绍
- Mybatis支持自定义缓存
- 实现cache接口的类就可以作为自定义缓存
- 在
<cache type="自定义缓存全类名"></cache>
设置
- 但一般我们不会自定义缓存类,而是使用现有的缓存类,也是下面所说的ehcache
- EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点
4.2 整合步骤
- (1)需要导入相关Jar包
- ehcache-core-2.6.8.jar
- slf4j-api-1.7.30.jar
- slf4j-log4j12-1.7.30.jar
- 上面两个在Mybatis的框架下有
- mybatis-ehcache-1.0.3.jar
- (2)在映射文件中使用ehcache自定义缓存类
- (3)在src目录下,放置ehcache的配置文件
1 |
|
- (4)若其他Mapper文件也要配置该缓存空间
- 可以
<cache-ref namespace=""></cache-ref>
来进行配置 - 引用名称空间,可以使用别人的名称空间,共用缓存
- 可以
4.3 演示结果分析
- 重新执行二级缓存的测试方法
- 结果分析
- ehcahe将二级缓存文件保存在本地,可以去本地查看