`
宋双旺
  • 浏览: 157614 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

理解hibernate N+1问题

阅读更多

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

选自<<精通Hibernate:Java对象持久化技术详解>> 作者:孙卫琴 来源:www.javathinker.org
如果转载,请标明出处,谢谢


在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语句的数目。

分享到:
评论

相关推荐

    hibernate N+1问题解决办法

    **标题:“Hibernate N+1问题解决办法”** 在Java开发中,使用Hibernate作为ORM框架时,我们可能会遇到一个性能上的问题,那就是著名的“N+1查询问题”。此问题源于不恰当的数据加载策略,可能导致数据库查询效率...

    hibernate的n+1问题.docx

    《理解Hibernate中的N+1问题及其解决方案》 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,使用不当可能会导致性能瓶颈,其中最典型的就是“N+1次SELECT查询问题...

    How to solve the hibernate N+1 problem?

    标题 "如何解决Hibernate的N+1问题" 涉及的是一个常见的数据库查询优化问题,主要出现在使用Hibernate等ORM框架时。N+1问题是指在进行一对多或多对多关联查询时,原本期望通过一次SQL查询获取所有数据,但实际执行了...

    Hibernate教程24_Hibernate的1+N问题

    通过理解和掌握这些策略,开发者能有效地避免和解决Hibernate中的"1+N"问题,提高应用的性能。在提供的源码`s2sh_relation23_1+N`中,可能包含了示例代码,用于演示如何处理这种情况,通过学习和实践这些代码,可以...

    内容管理系统(hibernate3+struts2+spring2)130224.zip

    此外,确保正确配置数据库连接和实体映射,避免出现N+1查询或性能瓶颈。安全方面,Struts2的安全漏洞需要关注,及时更新到安全版本。 综上所述,内容管理系统(hibernate3+struts2+spring2)130224.zip是一个典型的...

    struts2+hibernate3+spring3分页

    SELECT * FROM table LIMIT (n-1) * pageSize, pageSize; ``` 其中,`n`为页码,`pageSize`为每页显示的数据条数。 **分页实现**:在SSH框架中,通常创建一个PageModel类来封装分页信息,包括总记录数、总页数、...

    struts+hibernate+spring集成实现分页

    在实际项目中,还需要考虑性能优化,比如缓存策略、避免N+1查询问题,以及如何处理用户跳转到非法页码等情况。此外,还可以使用Spring Data JPA等更高级的库来简化分页实现,提高开发效率。 通过SSH集成实现分页,...

    SSH框架整合spring4+hibernate4+struts2(终结版)

    此外,性能优化也是SSH项目中不可忽视的部分,如合理配置缓存、避免N+1查询等。 综上所述,SSH框架的整合是一项重要的技能,它涉及到了Java应用开发的多个层面,包括业务逻辑处理、数据持久化以及用户交互。理解并...

    struts2 + spring2.5 + hibernate3.0 + oracle 整合实例

    但同时,也需要注意性能优化,例如合理设计数据库索引,避免N+1查询问题,以及使用缓存技术提升应用性能。 总的来说,这个SSH整合实例涵盖了Java Web开发中的多个关键点,包括MVC设计模式、依赖注入、事务管理以及...

    Mysql解决数据库N+1查询问题

    对于MyBatis的配置,可以在XML映射文件中指定`association`标签,将关联对象设置为预加载,这样在获取User对象时,其对应的Department也会一并加载,避免了N+1问题。 7. **分页查询**: 当数据量非常大时,可以...

    Struts 2+Hibernate+Spring整合开发技术详解 12~17章

    - **国际化(Internationalization, i18n)**:Struts 2提供了强大的i18n支持,方便多语言环境下的应用开发。 - **Tiles布局**:集成Tiles框架可以实现页面模板化,提高页面设计的复用性。 2. **Hibernate ORM**...

    spring+hibernate+struts页面

    同时,还需要注意优化性能,如合理使用缓存,避免N+1查询等,以提升系统整体性能。总之,Spring、Hibernate和Struts的结合使用,为Java Web开发提供了强大的工具集,使得开发者能够更加专注于业务逻辑,而非底层实现...

    基于Struts2+Spring+Hibernate+MySql的注册登录系统

    然而,也需要注意一些潜在的问题,如性能优化(如合理配置Hibernate缓存,避免N+1查询等),安全性(如防止SQL注入,使用安全的密码哈希策略等),以及异常处理和错误信息的友好展示。 总的来说,"基于Struts2+...

    Struts2+Hibernate+Spring项目小结――Struts2部分总结

    "educationSelectItemInfos" executeResult="false" /&gt; ...在实际项目中,还需要结合Hibernate进行持久层操作,以及Spring进行依赖注入和事务管理,共同构建出完整的SSH(Struts2 + Hibernate + Spring)企业级应用。

    用于在基于JPA的Spring Boot Java应用程序中自动检测和断言“N+1选择问题”发生的工具,并在一般情况下发现JPA发出的SQL语句的来源- adgadev/jplusone

    1. **N+1选择问题**:当我们在查询主数据的同时,没有一次性获取所有关联数据,而是对每条主数据单独发起一次关联查询时,就会出现N+1问题。例如,对于一个用户列表,如果每个用户都有多个订单,那么原本只需一次...

    spring boot+hibernate+thymeleaf 练习demo项目源码

    4. `src/main/resources` - 存放资源文件,如数据库配置文件、日志配置、i18n国际化文件等,还有Hibernate的实体映射文件(`.hbm.xml`或使用注解)。 5. `src/main/webapp/WEB-INF/templates` - Thymeleaf模板文件...

    hibernate入门学习笔记+源码

    5. **查询优化**: 避免N+1查询问题,合理使用JOIN,减少数据库交互次数。 **六、源码分析** `hibernate_test`、`hibernate_test3`、`hibernate_test2`这些文件可能包含了示例项目的源代码,包括配置文件、实体类、...

    hibernate+springmvc整合代码

    此外,合理设计实体类和关联关系,避免N+1查询问题,以及正确管理事务的边界,都是提高系统性能的关键。 综上所述,`Hibernate+Spring MVC`的整合使得Web应用的数据访问和业务逻辑处理更加方便,同时提供了灵活的...

    Hibernate+struts2+spring_实现分页实例

    ### Hibernate+Struts2+Spring 实现分页实例详解 #### 一、概述 在Web应用开发中,分页是一项非常实用且常见的功能。本文将详细介绍如何利用Hibernate、...希望本文能帮助开发者更好地理解和掌握这三个框架的应用。

    spring+hibernate+webwork相关配置

    - 通过阅读框架源码,可以更深入理解其内部机制,有助于问题排查和性能优化。 综上所述,这个配置文件的整合涉及到多个层面,包括框架的独立配置、相互间的协作配置,以及整个Java Web应用的构建和运行环境。理解...

Global site tag (gtag.js) - Google Analytics