Mybatis的缓存机制
Mybatis的缓存机制
唐喜乐Mybatis缓存介绍
Mybatis本身包含了一个强大的查询缓存特性,大幅提升了查询的效率,分为一级缓存和二级缓存
- 一级缓存:也叫本地缓存,默认开启,作用范围为Sqlsession级别,
- 二级缓存:需要配置开启,作用范围为基于mapper的namespace级别
- 同时也提供了对外的缓存接口,支持接入第三方缓存组件,如Memcache、OScache、EHcache等
一级缓存原理
- 在一次数据库会话中(同一个sqlSession中),操作数据库时需要构建Sqlsession对象,在该对象会以HashMap的数据结构储存缓存数据
- 当执行查询语句时,会在缓存中进行获取,未获取到将会查询数据库,并将数据写入到缓存,后续同样的查询将会在缓存中获取数据
- 当SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;若调用clearCache(),会清空PerpetualCache对象中的数据
二级缓存原理
原理
二级缓存的作用域是整个SqlSessionFactory实例(通常一个 MyBatis应用程序只需要一个SqlSessionFactory实例)
所以通过SqlSessionFactory实例获取到的SqlSession实例能够共享MyBatis的二级缓存
使用条件
- 配置中开启二级缓存:mybatis-config.xml中的cacheEnabled配置未被设置为false,或者application.yaml的mybatis下configuration下设置cache-enabled: true配置项
xml方式:此时在需要配置二级缓存对象的映射(mapper.xml)的标签内配置 Mapper.java)上添加@CacheNamespace注解即可
注解方式:在接口对象xxxDao.java(或**
xml和注解的方式只能二选一- 配置的对象必须是可序列化的,即实现Serializable接口
- 只有提交(执行SqlSession#commit方法)或关闭(执行SqlSession#close方法)时数据才会被提交到缓存中
默认配置
- 所有 select 查询语句的结果都会被缓存;
- 执行 insert 语句,update 语句和 delete 语句后会刷新(清空)缓存;
- 缓存默认使用 LRU 淘汰策略来实现缓存淘汰;
- 缓存不会进行定时刷新;
- 缓存的默认大小是 1024 个;
- 缓存被设置为读/写缓存,这表示通过缓存获取到的对象并不是共享的,并且允许修改缓存
如需定制化配置请自行查阅<cache/>
标签的属性和配置
清除二级缓存
同namespace下,执行insert、update、delete方法会清除二级缓存
使用第三方缓存
这个倒是没怎么用过,先找一篇文章mark一下,后续有机会试试
SpringBoot整合Redis配置MyBatis二级缓存
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果