java缓存管理,一级缓存和二级缓存

一级缓存的生命周期和SqlSession的生命周期相同
二级缓存和整个应用的生命周期相同

一级缓存存放的结果不是查询出的结果本身,而是一个Map【无法关闭
//一级缓存中底层实现是一个Map
//key:statementId和sql语句
//value:查询结果
//包含查询结果本身,还和sql语句statement的ID有关系

增删改会刷新一级缓存
执行插入会对缓存造成影响,无论是否对sqlSession进行提交

配置二级缓存的时候,要在对应的xml文件中配置

二级缓存的配置:映射文件的总开关,主配置文件的开关,以及某个查询方法进行使用
    useCache="false"


全局开关默认打开,mybatis.xml
要打开要在对应的namesapce下打开cache
要访问的类要实现序列化的接口

缓存命中率: 配置缓存大小
           设置逐出策略
          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

你可能感兴趣的:(java)