什么叫n+1次select查询问题?

在Session的缓存中存放的是相互关联的对象图。默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的Order对象。以Customer和Order类为例,假定ORDERS表的CUSTOMER_ID外键允许为null,图1列出了CUSTOMERS表和ORDERS表中的记录。



以下Session的find()方法用于到数据库中检索所有的Customer对象:

List customerLists=session.find("from Customer as c");

运行以上find()方法时,Hibernate将先查询CUSTOMERS表中所有的记录,然后根据每条记录的ID,到ORDERS表中查询有参照关系的记录,Hibernate将依次执行以下select语句:

select * from CUSTOMERS;
select * from ORDERS where CUSTOMER_ID=1;
select * from ORDERS where CUSTOMER_ID=2;
select * from ORDERS where CUSTOMER_ID=3;
select * from ORDERS where CUSTOMER_ID=4;

通过以上5条select语句,Hibernate最后加载了4个Customer对象和5个Order对象,在内存中形成了一幅关联的对象图,参见图2。



Hibernate在检索与Customer关联的Order对象时,使用了默认的立即检索策略。这种检索策略存在两大不足:

(1) select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个Customer对象,那么必须执行n+1次select查询语句。这就是经典的n+1次select查询问题。这种检索策略没有利用SQL的连接查询功能,例如以上5条select语句完全可以通过以下1条select语句来完成:

select * from CUSTOMERS left outer join ORDERS
on CUSTOMERS.ID=ORDERS.CUSTOMER_ID

以上select语句使用了SQL的左外连接查询功能,能够在一条select语句中查询出CUSTOMERS表的所有记录,以及匹配的ORDERS表的记录。

(2)在应用逻辑只需要访问Customer对象,而不需要访问Order对象的场合,加载Order对象完全是多余的操作,这些多余的Order对象白白浪费了许多内存空间。
为了解决以上问题,Hibernate提供了其他两种检索策略:延迟检索策略和迫切左外连接检索策略。延迟检索策略能避免多余加载应用程序不需要访问的关联对象,迫切左外连接检索策略则充分利用了SQL的外连接查询功能,能够减少select语句的数目。

转载于:https://www.cnblogs.com/sunwei2012/archive/2010/01/03/1638421.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OGRE 入门 二、Basic Tutorial 1 : An introduction to the most basic Ogre constructs

1. 下载源代码及脚本 这里有一个‘Convenient All-In-One’ 版的框架。 2. 创建场景 解压clean_ogre_cmake_project.zip,修改TutorialApplication.cpp中的函数: 1 void TutorialApplication::createScene(void)2 {3 // create your scene here :)4 …

React Native 重新建项目遇到的一些问题

1、基本上一句话,就是本地的node太旧了,跟不上React_Native的节奏,所以需要更新node,但是单纯的更新node丫丫竟然不让我跟,因为是用Homebrew来管理的,所以先update了下brew brew update && brew up…

picACG本地缓存目录_手机上本地存储的哪些文件、文件夹不能删?

手机、电脑随着不断的使用,系统本身、系统工具、第三方应用都会不断产生一些临时文件和垃圾文件。手机产生的垃圾文件更是显得杂乱无章,虽然可以使用系统自带或第三方应用来清理垃圾,但在本地存储还是有大量的文件夹或文件是可以手动删除的。…

python元组和列表的联系_Python元组与列表的区别和联系?

1.元组和列表比较相似,不过它们之间也有着不同: (1)列表:一个大仓库,你可以随时往里边添加和删除任何东西。 (2)元组:封闭的列表,一旦定义,就不可…

pytorch自带网络_PyTorch机器学习笔记(1)整好环境

2020年1月1日炼丹第0步,装好环境系统 Ubuntu 18.04 LTS先装上conda(自带大多数科学计算基础包,以及比较优秀的包管理系统):国内网络环境建议到清华大学镜像站下载:Tsinghua Open Source Mirror​mirror.tun…

Effective C# Item22:使用事件定义外发接口

事件为类型定义了外发接口,C#的事件是建立在委托的基础上的,委托为事件处理器提供了类型安全的函数签名。 委托要比事件的使用范围广泛,我们可以把事件看做是一种经过了封装的委托,专门用于事件驱动模型。你可以在客户代码中直接调…

python画菱形的代码_Python打印“菱形”星号代码方法

本人是一名python初学者,刚刚看到一道有趣的python问题,“用python如何在编译器中打印出菱形图案?” 因此决定尝试一下,代码不多,仅供参考。 代码 def printStar(intNum): s "*" spaceLength intNum block…

Ubuntu 14.04.3 LTS 配置 DNS Server

我们目的是用一台局域网机器完成 192.168.1.113 <-->cloudshield.com的解析&#xff0c;指定A记录和CNAME; 0.关于Ubuntu 14.04.2 LTS 下载、安装、更新这里就直接跳过了; 1.下载安装工具 bind9 sudo apt-get install bind9 DNS 配置文件在/etc/bind 目录中。安装bind9后…

php代码加注释_怎么在php中添加注释

注释在写代码的过程中非常重要&#xff0c;好的注释能让你的代码读起来更轻松&#xff0c;在写代码的时候一定要注意注释的规范。php里面常见的几种注释方式&#xff1a;1.文件头的注释&#xff0c;介绍文件名&#xff0c;功能以及作者版本号等信息/***文件名简单介绍**文件功能…

数据库整理

转载于:https://www.cnblogs.com/cuikang/p/5131531.html

GridControl动态添加 颜色列

设计器&#xff1a; 核心代码&#xff1a; DataTable dt new DataTable("UniqueValue");dt.Columns.Add("symbol", typeof(Color));dt.Columns.Add("label",typeof(string));dt.Columns.Add("count",typeof(int));for (int i 0; i &…

代码托管使用指南

2019独角兽企业重金招聘Python工程师标准>>> 开源中国 登录https://git.oschina.net/ 点击 “” 增加新的项目出现创建项目界面&#xff0c;按照提示&#xff0c;输入相应内容点击“管理”显示如下界面 启用svn&#xff0c;输入你所设置的地址。 svn://git.oschin…

php中接口验证失败,php短信验证失败的原因

随着国民经济的高速发展&#xff0c;短信的应用也逐渐商业化&#xff0c;很多企业、商家开始使用php短信接口来进行推广、营销或内部管理&#xff0c;只是个别的商家在应用php短信接口的时候却遇到了短信发送失败的现象&#xff0c;这到底是因为商家操作有误&#xff0c;还是因…

CentOS6.3中挂载NTFS移动硬盘的经历

2019独角兽企业重金招聘Python工程师标准>>> 鄙人当年用PC硬盘做了一个移动硬盘&#xff08;其实并不方便移动&#xff0c;只是外边包装了一个壳子&#xff0c;可以用USB口访问而已&#xff09;&#xff0c;移动硬盘上存放了一些学习资料。某日想把一部分学习资料拿…

如何在vsc上下载php扩展包,正确的 Composer 扩展包安装方法

问题说明我们经常要往现有的项目中添加扩展包&#xff0c;有时候因为文档的错误引导&#xff0c;如下图来自 这个文档 的&#xff1a;composer update 这个命令在我们现在的逻辑中&#xff0c;可能会对项目造成巨大伤害。因为 composer update 的逻辑是按照 composer.json 指定…

python之33个关键字详解_Python解析、提取url关键字的实例详解

解析url用的类库: python2版本&#xff1a; from urlparse import urlparse import urllib python3版本&#xff1a; from urllib.parse import urlparse import urllib.request 研究了不同的url规则发现&#xff1a;只要在搜索关键字是用嫁接的&#xff0c;查询的关键在解析后…

当退出python时是否释放全部内存_python如何释放内存

关于Python中的内存释放问题 首先就不得不提到Python解释器在何种情况下会释放变量的内存。Python引用了内存计数这一简单的计数来控制。 python学习网&#xff0c;大量的免费python视频教程&#xff0c;欢迎在线学习&#xff01; 下面是引用计数的知识&#xff1a; 1) 增加引用…

利用7z来分卷压缩文件

最近做一个发送Email的小工具&#xff0c;里面有个附件的功能&#xff0c; 如果附件太大了&#xff0c;一般都是用winara 分卷压缩的&#xff0c;然后在上传。 如何用程序来实现自动的分卷压缩的呢?因为RAR不是免费的&#xff0c;就上网找了7z 安装好7z,把7z.dll拷贝到程式的目…

LoadRunner 12.02 安装教程及中文语言包安装

注意事项&#xff1a; 安装前&#xff0c;把所有的杀毒软件和防火墙关闭。 若以前安装过LoadRunner,则将其卸载。 安装路径不要带中文字符。 LoadRunner 12已经不再支持xp系统&#xff0c;仅支持win7和win8系统。 一、下载 首先可以在惠普官网下载Loadrunner12安装包。我的Load…

在WPF的TreeView中实现右键选定

在WPF中&#xff0c;TreeView默认情况是不支持右键选定的&#xff0c;也就是说&#xff0c;当右键点击某节点时&#xff0c;是无法选中该节点的。当我们想在TreeViewItem中实现右键菜单时&#xff0c;往往希望在弹出菜单的同时选中该节点&#xff0c;以使得菜单针对选中的节点生…