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