zoukankan      html  css  js  c++  java
  • Hibernate检索策略(抓取策略)(Hibernate检索优化)

    一、查询方法中get方法采用策略是立即检索,而load方法采用策略是延迟检索,延迟检索是在使用数据时才发送SQL语句加载数据

    获取延迟加载数据方式:1、使用的时候,如果Customer c=session.load(Customer.class,1);//加载id为1的客户,此时是延迟加载,返回的是代理对象,当使用的时候加载数据,如c.getName();

               2、调用Hibernate.initialize(c);方法,初始化对象,也可加载到数据

    二、类级别检索策略

    包括立即检索和延迟检索,即使用get和load方法,而Query查询的数据属于类级别检索中的立即检索

    可以在hbm.xml文件中的class节点配置lazy="false",这样load方法也变成立即检索了,和get方法一样了

    三、关联级别检索策略

    1、多对多与一对多,都是先得到一个再检索另一个,所以这两种情况一样

    在hbm.xml文件中set节点上设置fetch和lazy两个属性

    fetch可取值:join select subselect  fetch代表检索时语句方式

    lazy可取值:true false extra   lazy代表是否延迟

    (1)、如果fetch为join,则lazy失效,采用迫切左外连接

    (2)、fetch为select时,将生成多条简单SQL语句

        lazy=false,立即检索

        lazy=true,延迟检索

        lazy=extra,加强延迟检索(极其懒惰检索),比如查询关联类集合条数,则发送select count(*) from table

    (3)、fetch为subselect时,将生成子查询SQL语句,这时查询方法要用query.list().get

    使用Query查询数据时,自己编写hql语句,则fetch=join无效,关联集合将根据lazy设置进行加载

    2、一对一和多对一情形一样,都是由一个得到另一个

    在hbm.xml文件中many-to-one节点上设置fetch和lazy两个属性

    fetch可取:join select

    lazy可取:false proxy no-proxy

    (1)、如果fetch为join,则lazy失效,采用迫切左外连接

    (2)、fetch为select时,将生成多条简单SQL语句

        lazy=false,立即检索

        lazy=proxy,采用的检索方式为对方类级别检索方式,如订单查询客户是一对多,此时要采用customer.hbm.xml配置中class上配置的lazy检索方式

    使用Query查询数据时,自己编写hql语句,则fetch=join无效,关联集合将根据lazy设置进行加载

    结论:开发中能延迟则延迟,必须立即才立即(优化方案)

    四、批量检索,解决N+1查询问题

    N+1问题:如查询所有客户订单,首先查询出所有客户,而后根据每个客户id分别去查找订单,导致N+1问题

    其实质就是先查询所有客户,得到客户id,然后通过SQL的in语句来查询订单中客户id in(前门查出的id)中

    解决方案:在customer.hbm.xml文件中set节点设置batch-size属性,即,分批提取数据。如果共4个客户,设置值大于等于4会有两条SQL语句发出;如果设置小于4,则至少会有三条语句发出

    如果是通过订单查询客户解决N+1问题,而订单中没有set节点,就在客户hbm.xml配置文件的class节点配置batch-size(是查询客户,所以在客户class节点配置)

  • 相关阅读:
    共享纸巾更换主板代码分析 共享纸巾主板更换后的对接代码
    Python Django Ajax 传递列表数据
    Python Django migrate 报错解决办法
    Python 创建字典的多种方式
    Python 两个list合并成一个字典
    Python 正则 re.sub替换
    python Django Ajax基础
    Python Django 获取表单数据的三种方式
    python Django html 模板循环条件
    Python Django ORM 字段类型、参数、外键操作
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/5117612.html
Copyright © 2011-2022 走看看