• 延迟加载和一二级缓存


              1 延迟加载  

           分为3种  要想实现延迟加载 

           需在

    <settings> 中 加入两个节点  
    <setting name="lazyLoadingEnabled"  value="true"></setting>

    <setting name="aggressiveLazyLoading" value="false"></setting>

    这是 实现 延迟加载的两个节点

    之后 通过改变 以上 两节点 的 value 的 true false 的改变 来 实现 3 种 加载
    (1)<!--直接加载  false true-->

    (2)<!--侵入式加载 true true-->

    (3)<!-- 深度延迟加载 true false -->

    <settings>


    <setting name="lazyLoadingEnabled" value="true"></setting>
    <setting name="aggressiveLazyLoading" value="false"></setting>

    <!--直接加载 false true-->

    <!--侵入式加载 true true-->

    <!-- 深度延迟加载 true false -->


    <setting name="cacheEnabled" value="true"></setting>
    </settings>

    现在来介绍 什么叫 延迟 加载

                   延迟加载(lazy load)是(也称为懒加载),延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

                  可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。

                

                 直接加载 : 执行完 sql 语句,马上执行关联对象的sql语句  

                   一二级缓存  :

                    一级缓存都内置在CPU内部并与CPU同速运行,可以有效的提高CPU的运行效率。CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小得多但是交换速度却比内存要快得多。一级缓存越大,CPU的运行效率越高,但受到CPU内部结构的限制,一级缓存的容量都很小。

                    二级缓存又叫L2 CACHE,由于L1级高速缓存容量的限制,为了再次提高CPU的运算速度,在CPU外部放置一高速存储器,即二级缓存,它是处理器内部的一些缓冲存储器,其作用跟内存一样。 二级缓存是比一级缓存速度更慢,容量更大的内存,主要就是做一级缓存和内存之间数据临时交换的地方用。 缓存的出现使得CPU处理器的运行效率得到了大幅度的提升,这个区域中存放的都是CPU频繁要使用的数据,所以缓存越大处理器效率就越高,同时由于缓存的物理结构比内存复杂很多,所以其成本也很高。

                    下面  来进行 实际操作 证明 一级缓存  

              

    public dept one(int deptid);  接口 


    小配置
    <select id="one" resultMap="oneMapper" >

    SELECT dept.`deptid`,dept.`deptname`,emp.`empname` FROM dept,emp WHERE dept.`deptid`=emp.`deptid` AND dept.`deptid`=#{deptid}

    </select>

    resultMap

    <resultMap id="oneMapper" type="dept">

    <id column="deptid" property="deptid"></id>

    <result column="deptname" property="deptname"></result>

    <collection property="emps" ofType="emp">

    <result column="empname" property="empname"></result>

    </collection>
    </resultMap>

    以上两图 具体 在上一篇 博客中 就已经 讲解过了


    以下为 测试

     public  void day(){

    SqlSession session = Mybatis.getOpenSession();

    functiondao mapper = session.getMapper(functiondao.class);

    dept one = mapper.one(1);


    System.out.println(one.getDeptname());

    System.out.println("***********************************************************");
    //
    // int i = mapper.inser("领事部");
    //
    // System.out.println(i);


    System.out.println("***********************************************************");


    dept o= mapper.one(1);

    System.out.println(o.getDeptname());

    }

    实现效果

    
    

       两遍 相同 查询 在 记录下 我们 只会看见 走了一遍  

       现在 我把 测试类中 封起来 来的 insert 方法 发出来 并且 解除 然后 再去看控制台 

      

    public int inser(String deptname); 接口


    小配置
    <insert id="inser">

    INSERT INTO `dept` (deptname)VALUE (#{0})

    </insert>

    现在展示控制台

       

      这就是  被破坏 的 一级缓存   一级缓存 会被 增删改  操作所 破坏  所以 你会看见 相同的 两条 查询  sql 


    现在来说 二级缓存

    实现之前 有 三步操作 在
    <settings>  节点中 加入 

    <setting name="cacheEnabled" value="true"></setting>   

    把 你 涉及 二级 查询 操作的 所有 的实体类 实现一下
    implements Serializable  序列化  

    还有 一步 在 小配置中 加入 一个 自闭合 标签
    <cache />   

    我们 在 用 一个 方法的时候 用不同的 失去了session 去 试验

    //证明二级缓存的存在性
    @Test
    public void secondLevelHasExist(){
    SqlSession sqlSession = MyBatisUtil.getSession();
    IDeptDao mapper = sqlSession.getMapper(IDeptDao.class);
    Dept dept = mapper.getEmpByDeptNoMultiSQL(1);
    System.out.println("部门名称:"+dept.getDeptName());
    sqlSession.close();

    System.out.println("*********************************");
    SqlSession sqlSession2 = MyBatisUtil.getSession();
    IDeptDao mapper2 = sqlSession2.getMapper(IDeptDao.class);
    Dept dept2 = mapper2.getEmpByDeptNoMultiSQL(1);
    System.out.println("部门名称:"+dept2.getDeptName());
    sqlSession2.close();
    }

     这是 两个不同的 线程 ,但是 控制台 

       

    只走了一遍查询  这就是 2 级缓存 了 他只看 sql 语句 

  • 相关阅读:
    自动化运维 Expect
    C 语言Struct 实现运行类型识别 RTTI
    Mac 安装配置rz、sz
    Mac Vim + ctags 实现多目录跳转
    Mac 使用Sublime Text 3 搭建C开发环境
    this.$createElement用法
    判断一个数字在数组中出现次数
    iview的table:自定义table表格中列头的标题和点击事件(renderHeader)
    js计算不精确问题
    js 日期时间的格式化
  • 原文地址:https://www.cnblogs.com/LWLDD/p/8486152.html
Copyright © 2020-2023  润新知