`
xgbjmxn
  • 浏览: 268617 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

概括潜在的Hibernate性能问题

阅读更多
    *
      概括潜在的Hibernate性能问题
    * http://developer.51cto.com  2009-09-24 13:45  佚名  IT168  我要评论(0)

      这里介绍对于查询结果比较多的情况无疑是一个Hibernate性能上的潜在威胁。碰到这样的情况,将Many的查询进行分开也是一种解决办法。

      学习Hibernate时,经常会遇到Hibernate性能问题,这里将介绍Hibernate性能问题的解决方法。

      在使用Hibernate进行分页的过程中,如果你收到如下警告,那么这里就是一个潜在的Hibernate性能问题点:

      WARNING: firstResult/maxResults specified with collection fetch; applying in memory!

      出现这个警告的直接后果是:无论你想要看第几页的数据,从Hibernate打印出的SQL来看它总是查询了所有满足条件的结果。这是为什么呢?来看看这句警告所在的代码,它位于org.hibernate.hql.ast.QueryTranslatorImpl中,部分摘录如下:

         1. view plaincopy to clipboardprint? 
         2. QueryNode query = ( QueryNode ) sqlAst; 
         3. boolean hasLimit = queryParameters.getRowSelection() != null &&
            queryParameters.getRowSelection().definesLimits(); 
         4. boolean needsDistincting = ( query.getSelectClause().isDistinct() || hasLimit ) &&
            containsCollectionFetches(); 
         5. QueryParameters queryParametersToUse; 
         6. if ( hasLimit && containsCollectionFetches() ) { 
         7. log.warn( "firstResult/maxResults specified with collection fetch; applying in memory!" ) 
         8. RowSelection selection = new RowSelection(); 
         9. selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() ); 
        10. selection.setTimeout( queryParameters.getRowSelection().getTimeout() ); 
        11. queryParametersqueryParametersToUse = queryParameters.createCopyUsing( selection ); 
        12. } 
        13. else { 
        14. queryParametersqueryParametersToUse = queryParameters; 
        15. } 
        16. List results = queryLoader.list( session, queryParametersToUse ); 
        17. QueryNode query = ( QueryNode ) sqlAst; 
        18. boolean hasLimit = queryParameters.getRowSelection() != null &&
            queryParameters.getRowSelection().definesLimits(); 
        19. boolean needsDistincting = ( query.getSelectClause().isDistinct() || hasLimit ) &&
            containsCollectionFetches(); 
        20. QueryParameters queryParametersToUse; 
        21. if ( hasLimit && containsCollectionFetches() ) { 
        22. log.warn( "firstResult/maxResults specified with collection fetch; applying in memory!" ); 
        23. RowSelection selection = new RowSelection(); 
        24. selection.setFetchSize( queryParameters.getRowSelection().getFetchSize() ); 
        25. selection.setTimeout( queryParameters.getRowSelection().getTimeout() ); 
        26. queryParametersqueryParametersToUse = queryParameters.createCopyUsing( selection ); 
        27. } 
        28. else { 
        29. queryParametersqueryParametersToUse = queryParameters; 
        30. } 
        31. List results = queryLoader.list( session, queryParametersToUse ); 

      关键在于if ( hasLimit && containsCollectionFetches() 这句判断,如果满足了这个条件,RowSelection将会被重新生成,原本分页需要的firstRow和maxRows属性将会丢失,后面的数据库分页自然也无法进行。Hibernate这么做的原因从代码上也很容易理解,如果查询需要限制条数(limit/offset)并且需要fetch结合对象,则重新生成RowSelection,进一步解释,就是当一个实体(A)和另一个实体(B)是One-To-Many关系的时候,一个需要fetch 的典型查询语句是“select distinct a from A a left join fetch a.b”,由于1个A可能对应多个B,这个时候数据库查询的结果条数和需要生成的A对象的条数可能不一致,所以无法利用数据库层的分页来实现,因为你真正想分页的是A而不是A left join B。出现这个警告就是提醒你这个查询实际上是查询了所有满足条件的数据,Hibernate是在内存中对其进行了假分页的处理。

      这样,对于查询结果比较多的情况无疑是一个Hibernate性能上的潜在威胁。碰到这样的情况,将Many的查询进行分开也是一种解决办法。

      【编辑推荐】
         1. 分析Hibernate插入操作
         2. 剖析Hibernate批量更新
         3. 全面讲解Hibernate二级缓存
         4. 讲述Hibernate核心接口
         5. 概括Hibernate批量处理
      【责任编辑:志京 TEL:(010)68476606】

原文:概括潜在的Hibernate性能问题
    标 签:  Hibernate性能

上一篇: 浅析Hibernate VO与PO区别 下一篇: 分析Hibernate自增主键
网友评论
查看所有评论(0)
通行证: 密码:   注册通行证
发表评论请注意语言文明
分享到:
评论

相关推荐

    hibernate性能测试代码

    本话题将深入探讨“Hibernate性能测试代码”,以帮助我们理解如何有效地评估和优化Hibernate在实际应用中的表现。 首先,性能测试是软件开发过程中的关键环节,它旨在确定系统的响应时间、吞吐量和资源利用率等指标...

    Hibernate性能优化研究.pdf

    ### Hibernate性能优化研究 #### 一、引言 随着企业级应用的发展,高效的数据持久化技术成为了提升系统性能的关键因素之一。Hibernate作为一种流行的面向Java环境的对象关系映射(Object-Relational Mapping,简称...

    Hibernate性能优化

    《Hibernate性能优化》 在Java应用开发中,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,如果不进行适当的优化,它可能会成为系统性能的瓶颈。以下是一些关于Hibernate性能优化...

    hibernate性能优化

    珍藏的hibernate性能优化,如果对hibernate进行优化,很详细,是工作和面试的好助手

    优化Hibernate性能的几点建议

    ### 优化Hibernate性能的几点建议 #### 一、调整Fetch Size以提高性能 在使用Hibernate进行数据查询时,Fetch Size的设置对性能有着显著的影响。Fetch Size是指每次从数据库中取出的数据行数,默认情况下,Oracle...

    hibernate性能:性能、规模、风险 初评

    ### Hibernate性能:性能、规模与风险初评 #### 一、引言 随着软件系统的不断发展,数据持久化技术成为现代应用程序不可或缺的一部分。其中,Hibernate作为一款流行的Java ORM(Object Relational Mapping)框架,...

    如何提高hibernate性能

    【提高Hibernate性能】 在开发大型企业级应用时,ORM框架如Hibernate在处理大量数据时可能会出现性能瓶颈。针对这种情况,优化Hibernate的配置和使用策略至关重要。以下是一些提高Hibernate性能的关键点: 1. **...

    Hibernate性能优化:一级缓存

    本文将深入探讨Hibernate性能优化中的一个重要概念——一级缓存,并结合给出的压缩包文件“hibernate_cache_level1”,来详细解析一级缓存的工作原理及其优化策略。 一级缓存是Hibernate内置的一种缓存机制,它存在...

    hibernate性能优化.doc

    Hibernate 性能优化 在 Hibernate 中,性能优化是非常重要的,因为它直接影响着应用程序的效率和可扩展性。...Hibernate 性能优化需要我们注意批量处理和 1+n 问题,并使用相应的解决方法来避免这些问题。

    Hibernate分页可能引起的性能问题

    Hibernate分页可能引起的性能...在使用Hibernate进行分页的过程中,如果你收到如下警告,那么这里就是一个潜在的性能问题点: WARNING: firstResult/maxResults specified with collection fetch; applying in memory!

    Hibernate性能调优

    《Hibernate性能调优》 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,被广泛用于数据库操作。然而,如果不合理地使用或配置,Hibernate可能会导致性能瓶颈。本文将深入探讨如何对...

    Hibernate性能优化共9页.pdf.zip

    《Hibernate性能优化共9页.pdf》的压缩包文件聚焦于Java开发中的一个重要框架——Hibernate的性能调优。Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作,但同时也可能带来性能问题。以下...

    Hibernate 性能优化

    然而,对于初次接触 Hibernate 的开发者来说,可能会遇到性能方面的问题,尤其是在与传统的 JDBC 方式相比时。这些问题如果不加以解决,很容易影响到项目的整体进度。本文将详细介绍如何优化 Hibernate 的性能,并...

    提升Hibernate性能的魔方——IronTrack SQL.pdf

    在提到提升Hibernate性能的魔方——IronTrack SQL时,我们必须首先了解IronTrack SQL的背景和功能。IronTrack SQL是基于Apache许可证的开源工具,通过与开源JDBC驱动p6spy合作,提供了一个增强的对基于Hibernate的...

    Struts Spring Hibernate性能优化

    在进行大型项目开发时,性能优化是至关重要的,特别是对于基于SSH(Struts、Spring、Hibernate)这样的企业级框架的应用。SSH性能优化主要是针对Struts的MVC处理、Spring的依赖注入以及Hibernate的对象关系映射进行...

    Hibernate缓存,性能优化

    在IT领域,尤其是在Java开发中,Hibernate作为一款流行的开源对象关系映射(ORM)框架,其缓存机制是实现高性能数据库交互的关键技术之一。本文将深入探讨Hibernate缓存的原理、类型及其对性能优化的影响。 ### ...

Global site tag (gtag.js) - Google Analytics