目录
什么是mybatis缓存?
- 查询数据时将查询结果存放到内存(缓存区)中。
- 每次查询数据时,先判断缓存区中是否存在数据,
- 如果存在,就从缓存区中获取数据
- 如果不存在,就从数据库中获取数据,将数据存放到缓存区中,给下次访问使用
- 好处:
- 避免频繁与数据库交互,提高数据访问效率。提升系统性能。
一级缓存
- 一级缓存是SqlSession自带的。SqlSession对象被创建,一级缓存就存在了。
- 默认开启
- 如果SqlSession对象关闭或调用清理方法,会导致缓存失效。
- 两次sql查询中间发生了增删改(insert、update、delete)等操作commit后,SqlSession的缓存会被清空
- 缓存底层实现就是通过HashMap实现的。key为hashcode+statementId+sql语句,Value为查询出来的结果集映射成的java对象。
- 一级缓存介质——内存
二级缓存
- 二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享且向sql中传递的参数也相同,即最终执行相同的sql语句。
- 默认不开启
- 二级缓存SqlSessionFactory进行管理的。SqlSessionFactory对象是进程级别的。可以被多个SqlSession所共享。
- 二级缓存介质——内存,硬盘
- MyBatis框架自带了二级缓存,是通过HashMap实现的。
二级缓存使用,需要在主文件中进行配置:
①启用二级缓存
<!-- 启用二级缓存 -->
<setting name="cacheEnabled" value="true"/>
②在XxxMapper.xml文件中配置二级缓存策略、
<cache eviction="FIFO" flushInterval="60000"readOnly="true" size="512"/>
1.eviction:缓存策略
FIFO:First In First Out
LRU:Least Recently Used
2.flushInterval:缓存刷新时间间隔,时间是毫秒,检查是否存在过期对象
3.size:缓存中存储的对象个数
4.readOnly:是否只读
③对于MyBatis自带的二级缓存,实体类可以不用实现可序列化接口。
如果使用的是EhCahce缓存组件,有时会将数据缓存到硬盘上,需要可序列化支持的。必须实现java.io.Serializable