延迟加载和一二级缓存

          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 语句 

原文地址:https://www.cnblogs.com/LWLDD/p/8486152.html