码迷,mamicode.com
首页 > 其他好文 > 详细

SSM-MyBatis-17:Mybatis中二级缓存

时间:2018-02-27 23:40:38      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:enable   sys   更新   级别   hibernate   证明   执行   同名   serialize   

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

二级缓存

  Mybatis中,默认二级缓存是开启的。可以关闭。
  一级缓存开启的。可以被卸载吗?不可以的。一级缓存不可以卸载,天然和框架绑定。
内置二级缓存
    由于MyBatis从缓存中读取数据的依据与SQL的id相关,而非查询出的对象。所以,使用二级缓存的目的,不是在多个查询间共享查询结果(所有查询中只要查询结果中存在该对象,

    就直接从缓存中读取,这是对查询结果的共享,Hibernate中的缓存就是为了在多个查询间共享查询结果,但MyBatis不是),而是为了防止同一查询(相同的Sql id,相同的sql语句)的反复执行。

 

  一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其生命周期为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。

  二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache

  对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear

 

------------------------------------------------------------------------------------------------------------------------------------------------------------》

  内置二级缓存的使用简单配置步骤

      1.cacheEnabled=true;(这个默认值就是true,想用二级缓存可以不做配置,不想用改成false,在大配置中

 

<settings>
        <setting name="cacheEnabled" value="true"/><!--开启,他也是默认值-->
        <!--<setting name="cacheEnabled" value="false"/>--><!--关闭-->
    </settings>

 

      2.实体类实现序列化接口Serializeble

        由于我做的是关联查询,并且没有做延迟加载,所以俩个实体类都得实现Serializeble接口

      3.在接口同名的xml小配置中

        加入一个自闭和的<cache/>


------------------------------------------------------------------------------------------------------------------------------------------------------------》

  内置二级缓存存在性证明

  都已经知道一级缓存是sqlsession的级别,如果要是close掉,换成不同的sqlsession怎么办?

/*二级缓存*/
    @Test
    public void t4SecondCacheHasExist(){
        SqlSession session= MyBatisUtils.getSession();

        IDeptDAO mapper = session.getMapper(IDeptDAO.class);
        Dept depts = mapper.findDeptnoALLEmpsMoreSql(1);
        System.out.println(depts.getDeptName());
        session.close();

        System.out.println("===================我是高冷的分割线=====================");
        SqlSession session2= MyBatisUtils.getSession();

        IDeptDAO mapper2 = session2.getMapper(IDeptDAO.class);
        Dept depts2 = mapper2.findDeptnoALLEmpsMoreSql(1);
        System.out.println(depts2.getDeptName());
        session2.close();


    }

 

    运行结果

      技术分享图片

  但由于他对数据库只发了上面的sql,分割线后就没有去数据库去查找了,而sqlsession关闭掉了,并且又开了一个,说明二级缓存真的存在,是真的运用上了

 

 

@Mark今天写到这,下次继续完善

 

SSM-MyBatis-17:Mybatis中二级缓存

标签:enable   sys   更新   级别   hibernate   证明   执行   同名   serialize   

原文地址:https://www.cnblogs.com/DawnCHENXI/p/8480845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!