一 myBatis框架中缓存分类:
一级缓存:
[会话缓存]。在当前用户访问数据库期间,所有的查询结果都会自动
保存起来。用户可以使用SqlSession从一级缓存中进行读取。
而其他用户的SqlSession是不能读取当前用户的一级缓存
一级缓存自动开启,开发人员是不能关闭一级缓存
二级缓存:
【全局缓存】,
1.二级缓存针对某一个表来设置的共享缓存
2.如果一个SqlSession对象将要被销毁时,MyBatis框架
自动将这个SqlSession中与当前表关联的数据存放到这个共享缓存中.
3.那么此时其他SqlSession如果需要得到相同的数据,就可以到共享缓存中
读取
4.由于二级缓存对于服务端内存消耗较大,因此MyBatis框架是不会主动
开发二级缓存,需要开发人员手动开启二级。
二 一级缓存失效原因:
1.同一个用户,使用两个SqlSession,是看不到一级缓存工作。
2.在一个SqlSession,使用查询条件不同,也会导致一级缓存失效
select * from dept where deptno=10 结果1
select * from dept where deptno=20 结果2
3.在一个SqlSession使用相同查询条件此时在查询之间进行数据修改操作导致一级缓存刷新(清空)
4.在一个SqlSession使用相同查询条件此时手动刷新缓存时导致一级缓存失败
三 与MyBatis中【一级缓存】和【二级缓存】关联的属性
1.全句变量:核心配置文件
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
1)cacheEnabled[默认值就是true]: 表示开启二级缓存
2)cacheEnabled=false, 关闭二级缓存。一级缓存依然存在
2.useCache: mapper.xml 会在<select>出现属性
<select id="findDeptByNo" resultType="dept" useCache="true">
1)useCache只出现在<select>
2)useCache默认值就是true
3)userCache设置false时,对于一级缓存没有任何影响
此时第一个SqlSession与当前查询语句
关联的结果,在第一个SqlSession关闭时
是不会放到二级缓存中。
3.flushCache:mapper.xml
1)flushCache会出现【添加,更新,删除,查询】标签
2)flushCache属性决定当前SQL执行完毕后,是否会刷新(清空)缓存
3)flushCache在【添加,更新,删除】标签中,默认值true
(清空一级缓存数据/清空二级缓存对应的mapper.xml所有数据)
4)flushCache在【添加,更新,删除】标签中,设置为false
(清空一级缓存数据/不会清空二级缓存数据)
5)flushCache也可以在【查询标签出现】,默认值false
(一级缓存和二级缓存都可以使用)
6)flushCache在查询标签中设置为true。(查询结果不会保存到一级缓存和二级缓存)
4.sqlSession.clearCache(): 只会清空当前会话的一级缓存。不会影响数据保存到二级缓存