2019独角兽企业重金招聘Python工程师标准>>>

前一篇文章两种极端:频繁的查询和巨大的结果集讲到了Hibernate加载数据时可能会出现的两种极端情况:频繁的查询和一次查出巨大的结果集。其中:N+1次查询是前一种情况的一个典型案例,笛卡尔积则是后一种情况的典型案例。下面分别简单地再总结一下这两种极端案例出现的原因以及调优方法。

一.N+1次查询

如果一个集合是lazy loading的,那么在第一次访问到这个集合时,hibernate会生成一个select被这个集合加载出来。这是N+1中的1。紧接着,在迭代这个集合的过程中,如果要访问集合元素所依赖的其他关联对象时,若它的关联对象也是lazy loading的,那么hibernate会生成一个select从数据库中加载出这个关联对象。这样,N次循环就会生成n个select,这就是N+1中的N.

解决N+1次查询需要在制定动态抓取策略时eager fetch出集合和集合元素的依赖对象,这样只会生成一条SQL。具体做法是在HOL中,使用fetch关键字来抓取所需要的对象。在Criteria中使用setFetchMode方法设置目标抓取对象。具体示例请参考JPwH-13.5.2

二.笛卡尔积

N+1次查询的反面就是笛卡尔积。一般来说,通过定制动态抓取策略,不会加载出我们不需要的数据,但是有一种情况下,即使我们只加载必需对象也会造成大量数据被select出来,这就是抓取“平行”集合导致的笛卡尔积。

例如:一个Forum有一个Moderator集合,大小为3和一个Thread集合,大小为100。如果在加载Forum时,单独抓取Moderator集合,结果集是3,单独抓取Thread集合,结果集是100,同时抓取这两个集合的结果集是两个集合的加乘(也就是笛卡尔积)为:3*100.如果还有第三个集合,大小是50的话,那结果集就会变成3*100*50. 因此我们可以看到:抓取“平行”集合会产生笛卡尔积,如果集合很多或集合中的元素很多,会使结果集急剧的膨胀。一个巨大的结果集所带来的性能损失是什么呢?想想数据库服务器处理这个条数据所花的时间,占用的服务器的内存,通过网络传输这些数据,以即到了应用服务器占用的内存和hibernate封装这些数据所花费的时间,和这些开销相比,分成两三个SQL(会成数量级的减小结果集)来获取数据要快得多得多。

HIbernate并不禁止我们产生笛卡尔积,也就是说,你可以在一个抓取计划中抓取多个“平行”集合。但是有一个例外,就是bag集合。Hibernate不允许同时抓取两个以上的bag集合。这是因为:The resultset of a product can’t be converted into bag collections, because Hibernate can’t know which rows contain duplicates that are valid (bags allow duplicates) and which aren’t.

对于“平行”集合的问题,在抓取时要灵活应对,如果预计到结果集会很大,那么就不要使用join fetch,而要使用subselect fetch!subselect fetch是平行集合的推荐优化方案。

关于N+1次查询和笛卡尔积,请参考JPwH_13.2.5节。

转载于:https://my.oschina.net/pangzhuzhu/blog/326989

两种极端情况的案例:N+1次查询和笛卡尔积相关推荐

  1. 移动Web开发图片自适应两种常见情况解决方案

    本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案.开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集, ...

  2. ML之分类预测:分类预测评估指标之AUC计算的的两种函数具体代码案例实现

    ML之分类预测:分类预测评估指标之AUC计算的的两种函数具体代码案例实现 目录 分类预测评估指标之AUC计算的的两种函数代码案例实现 输出结果 实现代码

  3. 工业互联网的两种极端想法和两点反思

    目       录 1.      概述 2.      两种极端想法 3.      两点反思  1.  概述 最近走访了很多企业,涉及到的行业包括:军工.特钢.有色.加工制造(海洋钻井平台).建材 ...

  4. 当这个小女孩分别穿着漂亮和破旧的衣服站在大街上,她经历了两种极端...

    http://fashion.sohu.com/20161216/n476108521.shtml http://fashion.sohu.com/20161216/n476108521.shtml ...

  5. 以两种异步模型应用案例,深度解析Future接口

    摘要:本文以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类. 本文分享自华为云社区<[精通高并发系列]两种异步模型与深度解析Future接口(一) ...

  6. 关于计算机网络实验心得体会以及两种错误情况

    一开始就是在反复地试错当中,因为对每行代码不够理解导致配置总是出错误,现在已经熟知了自己的两种错误 1是Error:Wrong parameter found at '^' position. 出现这 ...

  7. Redis command timed out 两种异常情况

    Redis command timed out SpringBoot项目引入Redis后发现偶尔会出现连接会超时Redis command timed out,看了博客上写的很多文章,都说可以通过设置 ...

  8. OpenERP采购的两种不同情况

    原材料采购有两种情况,一种是先收货,并按实际收货数量付款:一种是先付款,对方再发货.对于国内的供应商,通常都采用前者处理,但有些进口原材料,对方会要求先付款,或者预付部分款额,对方才会发货.两种情况在 ...

  9. SPI协议分析仪的使用介绍及flash无法启动两种案例分析

    SPI协议分析仪的使用介绍及案例分析 一.协议分析仪介绍 Kingst LA5016 USB 协议分析仪,支持众多标准协议解析,包括:UART/RS232/485,I2C,SPI,CAN,SMBUS等 ...

最新文章

  1. exec的不同实现--鸠占鹊巢还是功成身退
  2. 困难样本挖掘(Online Hard Sample Mining)
  3. “中国GPT-3”开放APP开发接口,百万奖金智能应用开发大赛同步启动
  4. hbase的HA模式配置和维护
  5. MFC CStringArray 字符串数组类 使用方法
  6. Python绘制图形之Matplotllib绘图
  7. Mybatis中Mapper动态代理方式
  8. flash player 11 相关资源
  9. AlertDialog用法。
  10. 浏览器通知--window.Notification
  11. php 文件预览 水印,php实现在线预览word等office文件,同时添加水印
  12. 网易云音乐推出“云村乐评路灯”开学季策划 再造刷屏事件营销
  13. 为什么用MongoDB而不用Redis
  14. 互联网上好的博客博主
  15. 新手上路参考驾驶手册 36计教你安全上路(收集)
  16. 常用传感器讲解二十一--加速度传感器(ADXL335)
  17. 姓名转拼音的几种格式
  18. 无情未必真豪杰,怜子如何不丈夫——愿天下有情人终成眷属
  19. Unity3D 矩阵运算
  20. IC基础知识(六)SV中default input #1 output #1的解释

热门文章

  1. 蓝桥杯第六届省赛JAVA真题----生命之树
  2. java洗牌_java语言实现简单的洗牌,发牌
  3. mysql数据库服务器名_mysql数据库服务器名
  4. 巴川数据科学炼成记_【脑王直通车】小小记忆高手炼成记
  5. python中reduce函数_Python中的reduce()函数
  6. rpm的mysql安装_MySQL 5.7.22 rpm 安装方式
  7. ebs oracle 落伍了吗_向不了解oracle EBS的人介绍Oracle EBS
  8. Linux 学会看日志文件处理问题
  9. 十年架构师详解JVM运行原理
  10. Word2Vec学习笔记(二)