zoukankan      html  css  js  c++  java
  • hibernate框架学习之数据抓取(加载)策略

    Hibernate获取数据方式

    lHibernate提供了多种方式获取数据

    •load方法获取数据
    •get方法获取数据
    •Query/ Criteria对象获取数据

    lHibernate获取的数据分为两类

    •直接获取的数据(类级数据/直接数据)

    •使用load/get方法根据OID获取数据
    •使用HQL语句获取到的数据
    •使用Criteria对象获取到的数据

    •使用关联关系获取主方数据时自动获取的从方数据(关联数据)

    •在一对一关系中,获取一方数据后所携带的从方数据
    •在一对多关系中,获取一方数据后所携带的从方数据
    •在多对一关系中,获取多方数据后所携带的从方数据
    •在多对多关系中,获取多方数据后所携带的从方数据

    l直接数据都是由某种操作得到的,关联数据是不能由某种操作直接获取,是基于其他操作获取到的

    直接数据加载方式

    •load方法获取数据

    •get方法获取数据

    •Query对象提供OID获取数据

    •Query对象调用list或uniqueResult获取数据

    •Criteria对象调用list或uniqueResult获取数据

    •Query对象不提供OID获取数据

    •Query对象调用list或uniqueResult获取数据

    •Criteria对象调用list或uniqueResult获取数据

    直接数据的载策略

    lload方法在加载数据时,判断一级缓存是否有被查找数据,如没有采用延迟加载形式获取数据,即只访问OID,不执行SQL语句,访问OID之外的属性,通过SQL语句获取数据。通过lazy属性配置控制是否延迟加载,如设置了lazy=“false”,那么将不存在延迟加载效果,此时load方法与get方法等同

    lget方法在加载数据时,首先判断一级缓存中是否存在要查找的数据,如果没有通过SQL语句,直接从数据库获取

    lQuery对象获取数据是直接通过SQL语句查找数据

    l问题:以下操作完成后会出现几条SQL语句

    •查找OID为10的数据,先执行load方法,遍历属性后,执行load方法,再遍历数据

    •查找OID为10的数据,先执行load方法,遍历属性后,执行get方法,再遍历数据

    •查找OID为10的数据,先执行get方法,不做任何遍历操作,执行 load方法,再遍历数据

    •执行Query对象查询OID为10数据,不做任何遍历操作,执行load方法,再遍历数据

    •执行Query对象查询OID为10数据,不做任何遍历操作,执行get方法,再遍历数据

    关联数据加载策略

    l关联数据的种类(以一对多为例)

    •在一对多配置中,查询主方数据时要加载从方数据的集合,此时从方数据属于关联数据,以下称为主关联数据

    •配置中<set>对应的数据

    •在一对多配置中,查询从方数据时要加载主方数据的对象,此时主方数据属于关联数据,以下称为从关联数据

    •配置中<many-to-one>对应的数据

    •其他关联情况与上述情况完全相同

    l关联关系中A到B与B到A的区别

    主关联数据加载策略

    l教师对学生的关系为一对多,此时在教师模型中配置学生的集合。对教师模型对应的配置文件中的set进行相关的配置,来控制对应的学生集合的数据加载策略

    image

    •fetch:用于控制进行关联查询时,产生的SQL语句

    •lazy:用于控制进行关联查询时,被关联数据的加载策略

    •fetch取值范围:select / subselect / join

    •lazy取值范围:true / false / extra

    主关联数据加载策略fetch=select

    llazy=false

    •获取主数据

    •执行主数据的查询SQL(一条SQL语句)

    •执行主关联数据所有信息查询SQL (多条SQL语句)

    •获取主关联数据集合中数据数量(A)

    •不执行SQL语句

    •获取主关联数据集合中数据的具体数据(B)

    •不执行SQL语句

    llazy=true

    •获取主数据

    •执行主数据的查询SQL

    •获取主关联数据集合中数据数量(A)

    •执行主关联数据对应的具体信息查询SQL(按需产生SQL语句A)

    •获取主关联数据集合中数据的具体数据(B)

    •执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)

    l注意:

    •操作A和操作B对应的查询SQL语句相同,查询执行后,数据存入一级缓存,下次查询时,不再执行SQL语句

    llazy=extra

    •获取主数据

    •执行主数据的查询SQL

    •获取主关联数据集合中数据数量(A)

    •执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)

    •获取主关联数据集合中数据的具体数据(B)

    •执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)

    l注意:

    •先执行A操作,再执行B操作,AB操作均产生SQL语句

    •先执行B操作,再执行A操作,BA操作只产生B操作SQL语句

    主关联数据加载策略fetch=subselect

    llazy=false

    •获取主数据

    •执行主数据的查询SQL(一条SQL语句)

    •执行主关联数据全部具体信息查询SQL (一条子查询SQL语句)

    •获取主关联数据集合中数据数量(A)

    •不执行SQL语句

    •获取主关联数据集合中数据的具体数据(B)

    •不执行SQL语句

    l注意(以下fetch=subselect情况均符合下列描述):

    •使用Query查询,并且未携带OID作为查询条件,查询SQL语句采用子查询的形式

    •使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)

    llazy=true

    •获取主数据

    •执行主数据的查询SQL(一条SQL语句)

    •获取主关联数据集合中数据数量(A)

    •执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)

    •获取主关联数据集合中数据的具体数据(B)

    •执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)

    l注意:

    •操作A和操作B对应的查询语句相同,查询执行后,数据存入一级缓存,下次查询时,不再执行SQL语句

    •使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)

    llazy=extra

    •获取主数据

    •执行主数据的查询SQL

    •获取主关联数据集合中数据数量(A)

    •执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)

    •获取主关联数据集合中数据的具体数据(B)

    •执行主关联数据对应的具体信息查询SQL (一条子查询SQL语句B)

    l注意:

    •先执行A操作,再执行B操作,AB操作均产生SQL语句

    •先执行B操作,再执行A操作,BA操作只产生B操作SQL语句

    •使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)

    主关联数据加载策略fetch=join

    l使用Query查询数据(不区分是否携带OID作为参数)

    llazy=false

    •获取主数据

    •执行主数据的查询SQL(一条SQL)

    •执行主关联数据的查询SQL (多条SQL)

    •获取主关联数据集合中数据数量(A)

    •不执行SQL语句

    •获取主关联数据集合中数据的具体数据(B)

    •不执行SQL语句

    l使用Query查询数据(不区分是否携带OID作为参数)

    llazy=true

    •获取主数据

    •执行主数据的查询SQL(一条SQL)

    •获取主关联数据集合中数据数量(A)

    •执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)

    •获取主关联数据集合中数据的具体数据(B)

    •执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)

    l注意:

    •操作A和操作B对应的查询SQL语句相同,查询执行后,数据存入一级缓存,下次查询时,不再执行SQL语句

    l使用Query查询数据(不区分是否携带OID作为参数)

    llazy=extra

    •获取主数据

    •执行主数据的查询SQL(一条SQL)

    •获取主关联数据集合中数据数量(A)

    •执行主关联数据集合数据总量查询SQL (按需产生SQL语句A)

    •获取主关联数据集合中数据的具体数据(B)

    •执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)

    l注意:

    •先执行A操作,再执行B操作,AB操作均产生SQL语句

    •先执行B操作,再执行A操作,BA操作只产生B操作SQL语句

    l使用load/get查询数据,此时lazy属性失效

    •获取主数据

    •SQL格式:左外连接查询

    •主数据与主关联数据一次性全部查询出来(仅一条SQL)

    •获取主关联数据集合中数据数量(A)

    •不执行SQL语句

    •获取主关联数据集合中数据的具体数据(B)

    •不执行SQL语句

    主关联数据加载策略总结

    lfetch属性控制生成的SQL语句的策略

    •select:独立查询语句

    •subselect:子查询语句

    •如果使用Query查询,并且没有提供OID时,才使用子查询

    •join:左外连接查询

    •如果使用load/get查询才使用左外连接查询

    llazy

    •false:不开启延迟加载策略

    •true:开启延迟加载策略

    •extre:开始加强延迟加载策略,当调用主关联数据集合对应的

    size()、isEmpty()等操作时,不加载具体数据

    从关联数据加载策略

    l教师对学生的关系为一对多,此时在学生模型中配置教师的对象。对学生模型对应的配置文件中的many-to-one进行相关的配置,来控制对应的教师对象的数据加载策略

    image

    •fetch:用于控制进行关联查询时,产生的SQL语句

    •lazy:用于控制进行关联查询时,被关联数据的加载策略

    •fetch取值范围:select / join

    •lazy取值范围:false / proxy / no-proxy(Hibernate拦截器)

    从关联数据加载策略fetch=select

    llazy=false

    •获取从数据

    •执行从数据的查询SQL(一条SQL语句)

    •执行从关联数据所有信息查询SQL (多条SQL语句)

    •获取从关联数据集合中数据的具体数据

    •不执行SQL语句

    llazy=proxy

    •获取从数据

    •执行从数据的查询SQL(一条SQL语句)

    •从关联数据lazy=false,执行从关联数据所有信息查询SQL(多条SQL)

    •获取从关联数据

    •从关联数据lazy=true,执行从关联数据所有信息查询SQL (按需产生SQL语句)

    从关联数据加载策略fetch=join

    l使用Query查询数据

    llazy=false

    •获取从数据

    •执行从数据的查询SQL(一条SQL语句)

    •执行从关联数据所有信息查询SQL (多条SQL语句)

    •获取从关联数据

    •不执行SQL语句

    l使用Query查询数据

    llazy=proxy

    •获取从数据

    •执行从数据的查询SQL(一条SQL语句)

    •从关联数据lazy=false,执行从关联数据所有信息查询SQL(多条SQL)

    •获取从关联数据

    •从关联数据lazy=true,执行从关联数据所有信息查询SQL (按需产生SQL语句)

    l使用load/get查询数据,此时lazy属性失效

    •获取主数据

    •SQL格式:左外连接查询

    •从数据与从关联数据一次性全部查询出来(仅一条SQL)

    •获取从关联数据

    •不执行SQL语句

    加载策略的选择

    l延迟加载可以有效的节约内存空间

    l在使用时,尽可能的使用延迟加载策略,只有不能使用延迟加载时,才使用立即加载策略

    l实际开发应用

    主/从数据加载优化

    l主/从数据加载,基于关联关系,对关联数据进行预加载,加载时基于配置不同,会产生执行多条SQL语句加载同一系列的数据。

    •例如获取主数据时,设定fetch=“select”,lazy=“false”

    •此时获取主数时,会立即查询对应的联合数据集合,此时使用多条SQL语句完成此操作

    l完成上述同一任务执行多条相同的SQL语句,需要开销的查询时间过高,此时可以通过设定每次查询获取的数据量提高效率

    l关联关系<set>中添加批量抓取策略batch-size=“3”

    批量抓取策略

    l批量抓取可以对所有关联关系进行设定

    •主数据关联数据

    •<set>配置设置batch-size

    •从数据关联数据

    •<many-to-one>配置设置batch-size

    lbatch-size的取值范围

    •batch-size默认设置值为1,即一次抓取1条数据

    •如果batch-size设置值过大,每次获取的数据量越多,内存消耗越高,速度越快

    •如果batch-size设置值过小,每次获取的数据量越少,内存消耗越低,速度越慢

  • 相关阅读:
    RedisUtil
    CSS基础知识点笔记
    fdgfgfgfgf
    PerfMon Metrics Collector插件的Disks I/O使用总结
    Jmeter使用笔记之html报告扩展(一)
    Jmeter使用笔记之意料之外的
    Jmeter使用笔记之函数
    Jmeter使用笔记之组件的作用域
    css 初始化文件 全面
    vue-grid-layout 使用以及各项参数作用
  • 原文地址:https://www.cnblogs.com/xyhero/p/9351839.html
Copyright © 2011-2022 走看看