MyBatis缓存
-
什么是MyBatis缓存:
Mybatis中有一级缓存和二级缓存。一级缓存又被称为本地缓存,是
Session会话级别
的,一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下一级缓存是开启的,而且是不能关闭的。二级缓存是针对mapper
进行的缓存,它的生命周期很长,跟Application的生命周期一样,也就是说它的作用范围是整个Application应用。 -
一级缓存的原理:
- 未开启二级缓存时图解:
-
工作机制:
一般而言,一个SqlSession对象会使用一个
Executor
对象来完成会话操作,Executor对象会维护一个Cache缓存,以提高查询性能。 -
步骤:
- 第一次发出一个查询的 sql 语句,查询结果写入sqlsession的一级缓存中,缓存使用的数据结构是一个map。
-
key:MapperID + offset + limit + Sql + 传入的参数
-
value:用户信息
-
同一个sqlsession再次发出相同的 sql 语句,就从缓存中取出数据。
-
如果两次中间出现commit 操作(修改、添加、删除),close(),clearCache()等方法时,这次sqlsession中的一级缓存区域全部清空,下次再去缓存中查询不到,所以要从数据库查询,从数据库查询到再写入缓存。
-
二级缓存原理:
-
如何开启二级缓存?
SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是
可序列化
的。 也就是要求实现Serializable接口
- Mybatis全局配置中启用二级缓存配置
- 在对应的 Mapper.xml 中配置cache节点
- 在对应的select查询节点中添加useCache=true
-
开启二级缓存时图解:
-
工作机制:
在一级缓存中,一个SqlSession对象会使用一个
Executor
对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true"
,那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor
,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。 -
注意:需要关闭一级缓存,即调用SqlSession的close()方法后,才能从二级缓存中查数据
-
步骤:
- 二级缓存的范围是mapper级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是map。
- mybatis 的二级缓存是通过 CacheExecutor 实现的。CacheExecutor 其实是 Executor 的代理对象。所有的查询操作,在 CacheExecutor 中都会先匹配缓存中是否存在,不存在则查询数据库。
-
-
第三方缓存库
- MyBatis的二级缓存设计得比较灵活,你可以使用MyBatis默认实现的二级缓存;你也可以通过实现org.apache.ibatis.cache.Cache接口自定义缓存;也可以使用第三方内存缓存库,如MemCached、OSCache、EHCache等