一级缓存的生命周期和SqlSession的生命周期相同
二级缓存和整个应用的生命周期相同
一级缓存存放的结果不是查询出的结果本身,而是一个Map【无法关闭
//一级缓存中底层实现是一个Map
//key:statementId和sql语句
//value:查询结果
//包含查询结果本身,还和sql语句statement的ID有关系
增删改会刷新一级缓存
执行插入会对缓存造成影响,无论是否对sqlSession进行提交
配置二级缓存的时候,要在对应的xml文件中配置
二级缓存的配置:映射文件的总开关,主配置文件的开关,以及某个查询方法进行使用
useCache="false"
<cache/>
全局开关默认打开,mybatis.xml
要打开要在对应的namesapce下打开cache
要访问的类要实现序列化的接口
缓存命中率:<cache size="512"/> 配置缓存大小
<cache size="512" eviction="LRU"/> 设置逐出策略
flushInterval="10000" 刷新的时间间隔【单位:毫秒
size设置缓存的大小
eviction设置二级缓存的逐出策略
flushInterval设置二级缓存的刷新间隔
//增删改操作对二级缓存进行了刷新(清空)
//1.刷新二级缓存执行了什么
//二级缓存的底层是Map
//key:hashCode + statementId + SQL语句
//value:查询结果
//刷新二级缓存实际上是将二级缓存中所有的Entry对象中的置为空,并没有删除整个Entry对象
//Key仍然保留,为此Cache的命中率提高了但是依旧要去查询数据库
/*
*
* 2.二级缓存什么时候执行到DB
* 有两种情况会到DB进行真正的查询
* 1>Map中根本就不存在要查找的Entry,也就是没有要查找到Key。命中率不会发生变化
* 2>Map中存在要查找的Key,但是Value值为Null
*
* 3.增删改查操作默认是可以影响二级缓存的,也可以设置不影响
* 在对应增删改的Statement添加flushCache="false" 刷新值默认是True,修改成False
* */
对类实行序列化
implements Serializable