`

20 Hibernate 1+N问题的原理与解决

阅读更多

什么时候会遇到1+N的问题?

前提:Hibernate默认表与表的关联方法是fetch="select",不是fetch="join",这都是为了懒加载而准备的。

 

1)一对多(<set><list>) ,在1的这方,通过1条sql查找得到了1个对象,由于关联的存在 ,那么又需要将这个对象关联的集合取出,所以合集数量是n还要发出n条sql,于是本来的1条sql查询变成了1 +n条 。

 

2)多对一<many-to-one>  ,在多的这方,通过1条sql查询得到了n个对象,由于关联的存在,也会将这n个对象对应的1 方的对象取出, 于是本来的1条sql查询变成了1 +n条 。

 

3)iterator 查询时,一定先去缓存中找(1条sql查集合,只查出ID),在没命中时,会再按ID到库中逐一查找, 产生1+n条SQL

 

 

怎么解决1+N 问题?


1 )lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。

 

2)使用二级缓存, 二级缓存的应用将不怕1+N 问题,因为即使第一次查询很慢(未命中),以后查询直接缓存命中也是很快的。刚好又利用了1+N 。

 

3) 当然你也可以设定fetch="join",一次关联表全查出来,但失去了懒加载的特性。

分享到:
评论
3 楼 a283037321 2013-06-19  
多对一怎么会出现N+1呢?在多的这边left join不就可以了
2 楼 darrendu 2009-09-29  
Iterator iter = session.createQuery("from Student").iterate();
while(iter.hasNext()) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}

Iterator iter = session.createQuery("from Student").iterate();
这条数据只会查询studentid

下面遍历时会去一级缓存去找,没有的,又会发出n条sql,
这个也是n+1
while(iter.hasNext()) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}

1 楼 darrendu 2009-09-29  
1 )1 对多,在1 方,查找得到了n 个对象, 那么又需要将n 个对象关联的集合取出,于是本来的一条sql查询变成了n +1 条
这个好像不是n+1问题啊

一个Class有多个student
在1 方,查找得到了n 个对象 ,n个Class
每一个Class对应一个set, n个Class就n个set
n+n了?
请举例说明好吗

相关推荐

    数据库与Hibernate教案

    - 故障排查和性能优化:讨论常见问题及解决办法,如N+1查询问题,以及如何优化Hibernate查询性能。 通过本教案的学习,你将能够熟练掌握数据库的基本操作,理解Hibernate的核心功能,以及如何利用AJAX提升Web应用...

    .hibernate 框架介绍

    Hibernate支持1:1、1:n、n:m等多种关联映射关系,可以有效地管理复杂的数据关系。 在Hibernate框架中,ORM模型简化了数据库查询的过程,开发者可以利用ORM框架提供的查询接口,以对象的方式操作数据,而无需深入...

    hibernate-原理共2页.pdf.zip

    - 合理设计数据结构,避免N+1查询问题。 - 选择合适的缓存策略,如查询缓存、集合缓存等。 综上所述,Hibernate通过提供ORM服务,简化了Java应用与数据库之间的交互,降低了开发难度。理解和掌握Hibernate的这些...

    struts_hibernate整合

    9. **测试与优化**:通过单元测试确保所有功能正常工作,同时考虑性能优化,如合理使用缓存、避免N+1查询问题等。 对于SSH初学者,理解并掌握这些基本概念和步骤至关重要。实践中可能会遇到各种问题,例如配置错误...

    hibernate 源码直接导入Eclipse

    - 动态加载策略:选择合适的懒加载和立即加载策略,避免N+1查询问题。 总之,导入Hibernate源码到Eclipse中,不仅有助于我们深入理解ORM的工作原理,还能提升我们的数据库操作和设计能力。通过实际操作和调试,...

    hibernate-orm-master.zip

    为了提升性能,Hibernate提供了多种优化手段,如:批处理(Batch Processing)、预加载(Preloading)、缓存策略调整、避免N+1查询问题等。理解并运用这些技巧,可以在保证代码简洁的同时,提升应用性能。 通过深入...

    hibernate API帮助文档 及hibernate学习笔记

    - 笔记可能涵盖了实际开发中遇到的问题、解决方案、性能优化技巧以及最佳实践,如批处理操作、避免N+1查询等。 - 可能会包含对复杂关联关系的处理,如多对一、一对多、多对多关系的映射。 - 可能涉及到Hibernate...

    Java开源项目Hibernate深度探险

    同时,合理设计实体类的懒加载策略,避免N+1查询问题,也是优化的重要环节。 六、总结 Hibernate作为Java领域广泛使用的ORM框架,极大地简化了Java应用的数据库操作,使得开发者能更专注于业务逻辑。然而,理解和...

    Hibernate 3.6.3 入门程序

    10. **延迟加载(Lazy Loading)**:为了解决N+1问题,Hibernate提供了延迟加载机制,只有当真正需要访问关联对象时,才会去数据库加载。 通过`HibernateDemo`这个项目,你可以学习如何配置Hibernate,创建实体类,...

    精通Hibernate源码.rar

    通过合理设置缓存策略、优化查询、避免N+1查询、使用批处理等方法,可以显著提升Hibernate应用的性能。 通过深入研究Hibernate源码,我们可以更好地理解ORM的工作原理,从而在项目实践中更好地运用Hibernate,提高...

    Hibernate实战第2版.zip

    9. 性能优化:讲解如何通过调整Hibernate配置、优化查询、缓存策略等手段提高应用性能,避免N+1查询问题,减少数据库访问次数。 10. 实战案例:通过实际的项目案例,演示如何在实际开发中应用Hibernate,解决常见的...

    Spring+hibernate实例

    9. **最佳实践**:在实际项目中,我们还需要遵循一些最佳实践,如合理设计数据模型,避免N+1查询,使用第一级缓存和第二级缓存提高性能,以及使用事务边界来保证数据一致性。 综上所述,"Spring+Hibernate实例"涵盖...

    hibernate-release-5.2.10

    3. 精细控制查询:避免N+1查询问题,合理使用JOIN,避免过多的子查询。 总结,Hibernate 5.2.10提供了一套完整的持久化解决方案,简化了Java应用程序与数据库的交互。通过理解和掌握其核心概念、API用法及最佳实践...

    Hibernate5用户手册中文版

    优化Hibernate应用包括合理设计实体关系、避免N+1查询问题、使用批处理和预加载、以及调整缓存策略。同时,了解和使用Hibernate的事件监听器、拦截器也能进一步提升性能。 **八、JPA集成** Java Persistence API...

    hibernate 3.3 源码

    这通常通过代理对象实现,避免了“n+1”查询问题,提高了性能。 通过研究Hibernate 3.3的源码,开发者不仅可以了解ORM的内部运作,还可以学习到设计模式的应用,如工厂模式、单例模式和代理模式等。此外,源码分析...

    精通Hibernate源代码

    4. 查询优化:合理使用HQL或Criteria,避免N+1查询问题。 八、源代码分析 深入研究Hibernate源代码,可以帮助我们理解其内部机制,如: - Session的实现原理,包括对象的保存、更新、删除操作。 - Query和Criteria...

    struts2,hibernate,spring,springmvc,mybatis

    国际化(i18n)则涉及如何支持多种语言,而防止重复提交是Web开发中的重要问题,Struts2提供了一种解决方案。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,简化了数据库操作。`day57_hibernate_多...

    hibernate

    了解如何优化Hibernate,包括批处理、合理使用缓存、避免N+1查询问题、减少无效的数据库访问等策略。 通过阅读压缩包中的`Hibernate原理与配置快速入门.pdf`和`Hibernate_DEV_GUIDE.pdf`,你可以深入了解Hibernate...

    精通Hibernate源码

    10. **查询优化**:分析Hibernate如何生成SQL语句,理解查询优化技巧,如避免N+1查询,使用JOIN fetch提前加载关联数据等。 11. **第二级缓存和查询缓存**:深入第二级缓存的实现,包括查询缓存,可以优化大规模...

    Spring攻略(第二版 中文高清版).part1

    1.1.1 问题 1 1.1.2 解决方案 1 1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决...

Global site tag (gtag.js) - Google Analytics