一级缓存
默认开启
# 一级缓存是sqlSession级别的
# 通过同一个sqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问
# 四种失效情况
# 不同的sqlSession
# 同一个sqlSession,但查询条件不同
# 同一个sqlSession,但两次查询期间执行了任何一次增删改操作
# 同一个sqlSession,但两次查询期间手动清空了缓存/sqlSession.clearCache();/
<!--Emp getEmpByEid(Integer eid);-->
<select id="getEmpByEid" resultType="Emp">
select * from t_emp where eid = #{eid}
</select>
// 实际只执行了一次sql,第二次是缓存
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Emp result1 = mapper.getEmpByEid(1);
System.out.println(result1);
Emp result2 = mapper.getEmpByEid(1);
System.out.println(result2);
二级缓存
手动开启
# 二级缓存是sqlSessionFactory级别
# 通过同一个sqlSessionFactory创建的sqlSession查询的结果会被缓存
# 开启
# 核心配置文件中,全局配置属性cacheEnabled="true",默认就是true
# mapper映射文件中设置标签<cache/>
# sqlSession关闭或提交之后,数据才会保存到二级缓存中
# 查询的数据所转换的实体类必须实现序列化的接口
# 失效情况
# 两次查询之间执行了任意的增删改,会使一级和二级缓存都失效
<!--设置二级缓存相关信息-->
<!--缓存的数据是在内存中-->
<!--eviction(缓存回收策略):
LRU(最长时间不被使用的)default
FIFO
SOFT(移除基于垃圾回收器状态和软引用规则的对象)
flushInterval:刷新间隔,单位ms,默认是仅调用语句时刷新
size:缓存最多可以存储多少个对象
-->
<cache eviction=""/>
缓存查询的顺序
# 先查询二级缓存
# 没命中,再查询一级缓存
# 没命中,查询数据库
# sqlSession关闭或提交之后,一级缓存中的数据会写入二级缓存