什么是一级缓存
- 一级缓存作用域在SQLSession中,同一个SQLSession中执行相同的SQL(参数、SQL相同),则第一次查询的结果写入缓存,第二次会直接读取缓存数据
- 基于PerpetualCache的HashMap
- 默认开启
- 失效策略:当两次查询中间发生了增删改的操作,commit之后,则会清空selSession;比如:sqlSession关闭;
什么是二级缓存
-
namespace级别的(一般一个mapper文件一个namespace),多个sqlSession可以共用一个二级缓存。
- 如果是多个mapping文件用了同一个namespace,那这两个文件将共用二级缓存。
-
基于PerpetualCache的HashMap
-
高级于一级缓存:可以自定义存储源:Redis之类的
-
默认关闭
-
失效策略:当两次查询中间发生了增删改的操作,commit之后,则会清空该二级缓存
-
注意点:实现二级缓存时,MyBatis建议返回的POJO是可序列化的,所以建议实体类实现Serializable接口
-
淘汰策略(算法)
- FIFO:先进先出
- LRU:最近最少使用淘汰
-
开启方法:
- 全局的mybatis配置文件
- 这个配置使全局的映射器器(⼆二级缓存)启用或禁⽤用缓存,全局总开关,这⾥里里关闭,mapper中开启了也没⽤用
- 全局的mybatis配置文件
<setting name="cacheEnabled" value="true" /> </settings>`
- mapping文件
<cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"/>
- 参数说明
- eviction:缓存回收策略
- FIFO
- LRU
- flushInterval:刷新时间间隔
单位毫秒,如果不配置,则会再SQL执行时才刷新缓存 - size:引用数目
缓存可以存储多少个对象,设置过大会导致内存溢出 - readOnly:只读标志
缓存数据只能读取而不可修改
- eviction:缓存回收策略
一级缓存和二级缓存的使用顺序
1.优先二级缓存
2.一级缓存
3.数据库