zoukankan      html  css  js  c++  java
  • Mybaits(11)延迟加载

    一、概述

    1.概念

      就是在需要用到数据时才去进行加载,不需要用的数据就不加载数据。延迟加载也称为懒加载。

    2.优缺点

    优点:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。 

    缺点:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。

    二、配置

    在MyBatis的settings配置中存在两个元素可以配置级联,如下表:

    配置项 作用 配置选项说明 默认值
    lazyLoadingEnabled

    延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。

    在特定关联关系中,可通过设置fetchType属性来覆盖该项的开关状态。

    true|false false
    aggressiveLazyLoading

    当启用时,对任意延迟加载属性的调用会使带有延迟加载属性的对象完整加载;

    反之,则每种属性按需加载

    true|false

    版本3.4.1(包含)之前为true,

    之后为false

    三、测试

    1.修改配置项

    我们在SqlMapConfig.xml中修改配置:

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

    2.测试

    我们在之前的测试类中进行测试:

     加断点进行调试:

     从上面看出运行到断点打出日志,雇员的基础信息个鉴别器的数据已经被sql取出,这是第一批被取出的数据。我们跳过断点继续执行:

     可以看出雇员的工牌和任务表都被查询出来了,为什么这两个被一并查询出来了?我们分析下雇员级联的层级关系,如下图:

     

     从上图我可以看出,aggressiveLazyLoading配置项是一个层级开关,当设置为true时,它是一个开启了层级开关的延迟加载。

    3.配置项修改:

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

    4.执行测试类打印日志

    从打印的日志中我们看出只有雇员记录打印出来了,其他内容都采取了延迟加载,并且层级加载也失效了。

    四、分析

    1.分析

      从测试中我们知道lazyLoadingEnabled决定是否开启延迟加载,而选项aggressiveLazyLoading则控制是否采取层级加载,但是他们都是全局性的配置,有时候并不能解决我们的实际需求。我们在加载雇员信息时只加载雇员任务信息,层级关系会将工牌信息也加载出来。为看处理这个问题,在MyBatis中使用fetchType属性,它可以处理全局定义无法处理的问题。

    2.fetchType

      etchType属性出现在级联元素中,在association和collection中,可以通过eager(获取当前pojo后立即加载对应数据)和lazy(获取当前pojo后延迟加载对应的数据)进行配置。注意discriminator没有这个属性可以配置。

    3.测试

    在保证配置文件中如下配置我们对之前的雇员配置文件进行修改。

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

    修改雇员相应的IEmployeeDao.xml配置文件:

    <collection property="employeeTaskList" column="id"
                fetchType="eager"
                select="com.xhbjava.dao.IEmployeeTaskDao.getEmployeeTaskByEmpId" />

    执行测试类打印日志:

     
    从日志中我们看到这个时候可以按照我们的需求进行数据加载,先加载雇员信息,再加载雇员任务信息,fetchType属性会忽略全局配置项lazyLoadingEnabled和aggressiveLazyLoading。

    
    
    
    
    
  • 相关阅读:
    运算符优先级(图表)
    VNC+SSH相关应用
    VNC常用操作及常见问题解决办法汇总
    操作系统(二): 进程与线程
    Java实现 蓝桥杯 算法提高 01背包
    Java实现 蓝桥杯 算法提高 01背包
    Java实现 蓝桥杯 算法提高 01背包
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
  • 原文地址:https://www.cnblogs.com/xhbJava/p/12375740.html
Copyright © 2011-2022 走看看