缓存机制简介
- Mybatis包含一个非常强大的查询缓存特性,可以方便的进行配置和定制,缓存可以提升查询效率
- Mybatis系统中默认定义了两级缓存
分别是一级缓存和二级缓存 - 默认情况下 只有一级缓存(SqlSession级别的缓存也称为本地缓存)开启
- 二级缓存需要手动开启和配置,它是基于namespace级别的缓存
- 为了提高扩展性。Mybatis定义了缓存接口Cache。我们可以通过Cacahe来定义二级缓存。
一级缓存的使用
- List item一级缓存【Local Cache】本地缓存 作用域默认是SqlSession。当Session flush或则是close后,Session中的所有Cacahe将被清空。
- 本地缓存不能被关闭,但是可以用clearCache()来清空缓存,或者改变缓存的作用域。
- 在Mybatis3.1之后 可以配置本地缓存的作用域。在Mybatis的全局配置文件中配置。设置名:localCacheScope,MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。 默认值为 SESSION,会缓存一个会话中执行的所有查询。
- 一级缓存的工作机制
同一次会话期间只要查询过的数据都会保存在当前SqlSession的一个Map中
Key:hashCode +查询的Sql +编写的sql查询语句+参数
这里是重点
一级缓存失效的几种情况
- 不同的SqlSession 对应不同的一级缓存 —>就是创建的sqlsession不同 即从SqlSessionFactory.oppenSession()拿出两个不同的对象
- 同一个SqlSession但是查询条件不同
- 同一个SqlSession两次查询期间执行了任何一次增删改操作
- 同一个SqlSession两次查询期间手动清了缓存
- 同一个SqlSession两次查询期间提交了事务
二级缓存的使用
- 二级缓存【second level cache】全局作用域缓存
- 二级缓存默认不开启 需要手动配置
- Mybatis提供二级缓存的接口以及实现,缓存要求POJO实现Serializable接口
- 二级缓存在SqlSession关闭或提交之后才会生效
- 二级缓存的使用步骤
- 全局配置文件中开启二级缓存
- 需要使用二级缓存的映射文件处理使用cache配置缓存
- pojo需要实现Serializable接口
- 二级缓存在sqlSession关闭或提交之后才会生效
- 关闭sqlSession或者提交sqlSession时,将数据缓存到二级缓存
- 二级缓存相关属性:
- eviction=“FIFO” 清除缓存策略
- flushInterval 刷新间隔 单位毫秒
- size 应用数目 正整数
- readOnly 只读true/false
缓存的相关属性设置
- 全局setting的cacheEnabled:配置二级缓存的开关 一级缓存一直是打开的
- select 标签的useCache属性:这个属性是用来配置这个select是否使用二级缓存 默认为true 一级缓存是一直使用的
- 所有的增删改查标签中的flushCache属性:增删改查默认为flushCache=true。Sql执行后会同时清空一级和二级缓存,默认查询是flushCache=false.
- sqlSession.clearCache():只是用来清除一级缓存
整合第三方缓存
- 为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
- EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider