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。

    
    
    
    
    
  • 相关阅读:
    Apache 虚拟主机 VirtualHost 配置
    EAX、ECX、EDX、EBX寄存器的作用
    Python中文文档 目录(转载)
    八度
    POJ 3268 Silver Cow Party (最短路)
    POJ 2253 Frogger (求每条路径中最大值的最小值,Dijkstra变形)
    2013金山西山居创意游戏程序挑战赛——复赛(1) HDU 4557 非诚勿扰 HDU 4558 剑侠情缘 HDU 4559 涂色游戏 HDU 4560 我是歌手
    HDU 4549 M斐波那契数列(矩阵快速幂+欧拉定理)
    UVA 11624 Fire! (简单图论基础)
    HDU 3534 Tree (树形DP)
  • 原文地址:https://www.cnblogs.com/xhbJava/p/12375740.html
Copyright © 2011-2022 走看看