`
coolwangyu
  • 浏览: 37800 次
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

影响Hibernate性能的因素

阅读更多

      影响Hibernate性能的因素

用了一段时间的hibernate后,总结了一些开发人员应该注意的一些影响其效率的细节。

1、不同的主健生成机制对性能的影响<o:p></o:p>

通常的生成机制又10几种,说一些常用的吧。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。我们系统中就是用这这种hi/lo生成方式么,但是它的好处跨不同数据库没有影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。在hibernate指南中有10种生成主健方式,根据你们具体业务定,不同方式有不同的优缺点。

<o:p> </o:p>

2 配置文件中外健的配置方式对性能的影响<o:p></o:p>

在写*.hbm.xml配置文件时,多考虑业务上的需要,看看表现层是否真的需要显示关联信息。 比如合同表中存在employeeid外健,因为表现层需要显示,所以需要配上多对1等配置,如果,页面不一定需要显示,则只配成外健性能更好些。

   

3 保存信息时关联表保存方式对性能的影响<o:p></o:p>

用员工合同表举例,比如其中employee已经被配置成多对一了。那么, 那么比如在添加记录时,我们系统中,原来的写法:  需要设置contractPO的相关必添信息以及需要employeeid调用查询方法,查找employeePO,然后,contractPO.setEmployee(employeePO) ;这样就多了一次查询,我试验过,可以这样写:

    EmployeePO employee = new EmloyeePO();

    employee.setOid(oid)  ;

    contractPO.setEmployee(employeePO)

    这样写,就可以少一次查询。

<o:p> </o:p>

4 数据库方面对性能的影响<o:p></o:p>

hibernate本身没有什么可以提高性能的,它已经很不错了,主要是在我们的系统设计和写法上。此时,数据库的性能也是相关的一个方向,我的blog上有一个关于不同写法sql语句有不同的影响使用hibernate开发时,要将sql语句打印到控制台上,当你发现一个超作出现的查询次数和你的数据量有关系时,那么,你已经在代码设计上制造了一个很大的bug,调试他吧。还有,数据库在使用触发器时,没必要尽量少用,当然这算数据库方面对了,呵呵。

   

5 批处理参数对性能的影响<o:p></o:p>

根据你们产品的经常需要的批处理数量,适当设置配置文件属性中的配置:

[1] hibernate.jdbc.fetch_size   [2]  hibernate.jdbc.batch_size

这个多少是好我没研究过,满江红上的开源bbs用的是  [1]50 [2]25   。我们的用的多少我没去看,你那也有代码。

<o:p> </o:p>

6 配置文件参数对性能的影响<o:p></o:p>

dynamic-update 参数设定为生成Update SQL 时候,只包括当前发生变化的字段(提高DB Update性能)。

<o:p> </o:p>

7JavaBean的写法对性能的影响<o:p></o:p>

注意:在编写代码的时候请,对将POJOgetter/setter方法设定为public,如果设定为privateHibernate将无法对属性的存取进行优化,只能转而采用传统的反射机制进行操作,这将导致大量的性能开销(特别是在1.4之前的Sun JDK版本以及IBM JDK中,反射所带来的系统开销相当可观)。

      

8、缓存技术对性能的影响<o:p></o:p>

如果,业务中需要对某信息经常反复性的查询,但是却不进行修改,或者是很少进行修改,那么,利用缓存机制,也是一种不错的选择。我还没用上,以后尝试下。引入Cache机制的难点是如何保证内存中数据的有效性,否则脏数据的出现将给系统带来难以预知的严重后果。Hibernate 中实现了良好的Cache 机制,我们可以借助Hibernate 内部的Cache迅速提高系统数据读取性能。需要注意的是:Hibernate做为一个应用级的数据访问层封装,只能在其作用范围内保持Cache中数据的的有效性,也就是说,在我们的系统与第三方系统共享数据库的情况下,HibernateCache机制可能失效。

  

9、延迟加载对性能的影响<o:p></o:p>

延迟加载,一般我们都会选择,因为可以节省一部分性能。如,示例中user对象在加载的时候,会同时读取其所关联的多个地址(address)对象,对于需要对address进行操作的应用逻辑而言,关联数据的自动加载机制的确非常有效。但是,如果我们只是想要获得user的性别(sex)属性,而不关心user的地址(address)信息,那么自动加载address的特性就显得多余,并且造成了极大的性能浪费。为了获得user的性别属性,我们可能还要同时从数据库中读取数条无用的地址数据,这导致了大量无谓的系统开销。

      

10、初始化对性能的影响<o:p></o:p>

关于事物,利用Hibernate来完成启动和提交UserTransaction的功能的确可以,但这样的做法比原本直接通过InitialContext获取UserTransaction 的做法消耗了更多的资源,得不偿失。

还有其他一些常用的资源也可以在系统初始化时完成,这样,系统启动时间慢,但是运行会快一些。 

      

11hibernate的锁机制的选择对性能的影响<o:p></o:p>

相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。optimistic-lock="version"其中通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现,同时也是Hibernate中,目前唯一在数据对象脱离Session发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择version方式作为Hibernate乐观锁实现机制。      

<o:p> </o:p>

12Session管理对性能的影响:<o:p></o:p>

有效的Session管理机制,Hibernate应用设计的关键。在各种Session 管理方案中, ThreadLocal 模式得到了大量使用。ThreadLocal Java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制。我们系统中也用的这个。

      

<o:p> </o:p>

相关Hibernate性能的文章

不同的sql写法提高hibernate性能<o:p></o:p>

http://blog.csdn.net/CharlesYY/archive/2006/06/12/791011.aspx

<o:p> </o:p>

Hibernate之查询效率问题<o:p></o:p>

http://blog.csdn.net/CharlesYY/archive/<st1:chsdate year="2006" month="5" day="31" islunardate="False" isrocdate="False" w:st="on">2006/05/31</st1:chsdate>/765710.aspx

<o:p> </o:p>

      

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

 
分享到:
评论
1 楼 sgzlove2007 2007-06-15  
感觉这每一条都可以再去开一帖才能说清楚,期待着更详细的解说,然后我们有了更深入一点的了解后再去测试,毕竟没有那么多时间去研究源代码! 感谢

相关推荐

    Hibernate性能优化研究.pdf

    影响Hibernate性能的主要因素包括但不限于: - **网络延迟**:在多层分布式架构中,不同层之间的大量数据交换会引入额外的网络延迟。 - **数据库连接开销**:频繁地打开和关闭数据库连接会导致较高的资源消耗。 - *...

    Hibernate性能调优

    ### Hibernate性能调优知识点 #### 一、理解Hibernate与关联管理 在Hibernate中,关联管理是性能优化的关键因素之一。关联通常包括以下几种类型:单向`one-to-many`关联、双向`one-to-many`关联、`many-to-one`关联...

    Hibernate性能优化:一级缓存

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

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

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

    hibernate面试题2

    - **迫切左外连接检索(Fetch Join)**:兼顾透明性和效率,但可能加载不必要的对象,且复杂的表连接可能影响性能。 2. **查看Hibernate生成的SQL**:在`applicationConfig.xml`中设置`hibernate.show_sql`为`true...

    hibernate提升性能

    《Hibernate性能优化深度解析》 Hibernate,作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发人员可以更专注于业务逻辑而非底层数据处理。然而,随着项目规模的扩大,如果不...

    hibernate 调优

    ### Hibernate 性能调优详解 #### 一、概述 Hibernate 是一款优秀的 Java 持久层框架,它简化了数据库操作,使开发者能够更加关注业务逻辑而不是底层的数据访问细节。然而,在实际应用中,为了确保应用的高性能与...

    hibernate配置数据库连接池的三种方法

    数据库连接池是应用程序管理和维护数据库...总的来说,合理配置和使用数据库连接池是优化Hibernate应用性能的关键步骤之一,它有助于提升系统整体的运行效率,减少资源浪费,同时也便于监控和管理数据库连接的状态。

    hibernate技术研究对比总结

    总结 Hibernate 的优势和局限性,以及在不同项目选择 ORM 解决方案的考虑因素。 以上是对 Hibernate 技术的全面研究和对比总结,旨在为开发者提供详尽的信息,以便在实际开发中做出明智的选择。

    hibernate-release-5.3.6

    此外,5.3.6版本还包含了对JPA 2.2规范的全面支持,以及对Java 8特性的兼容,这些都是开发者在选择此版本时需要考虑的因素。 总之,hibernate-release-5.3.6.Final这个压缩包是深入了解和使用Hibernate 5.3.6版本的...

    Hibernate3.2连接池

    在选择连接池时,应考虑性能、稳定性和资源消耗等因素。C3P0因其易用性而成为首选,但Proxool可能在某些情况下提供更快的速度。DBCP由于存在的问题,一般不建议在Hibernate 3中使用。不过,最佳实践是根据具体项目...

    Hibernate主键生成方式

    在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键...在实际开发中,考虑到可移植性、性能和数据安全性,往往需要权衡各种因素来确定最佳方案。

    类似Hibernate的工具

    选择哪种工具主要取决于项目的具体需求,如性能、灵活性、学习曲线以及团队熟悉度等因素。 在实际开发中,了解和掌握这些ORM工具的用法和特性是非常重要的,它们可以帮助我们提高开发效率,降低维护成本,同时也能...

    加速你的Hibernate引擎

    【加速你的Hibernate引擎】这篇文章主要探讨了如何提升Hibernate性能,特别是在大数据持久化和查询服务中的优化策略。Hibernate作为流行的ORM工具,虽然易于使用,但优化却需要深入理解和实践经验。文章通过一个使用...

    Hibernate继承映射代码

    选择哪种策略取决于具体业务需求,如数据的规模、查询效率、表结构的复杂性等因素。 1. 单表继承:所有子类的数据都存储在一个表中,通常通过一个特定的字段(例如,discriminator column)来区分不同的子类。这是...

    virgo中添加hibernate需要的库

    在Virgo应用服务器中添加Hibernate支持,涉及到一系列...在实际操作中,可能还需要考虑其他因素,比如事务管理、缓存配置、性能优化等。记住,理解和熟练掌握OSGi的概念对于在Virgo中使用任何第三方库都是至关重要的。

    iBatis和Hibernate的区别

    - Hibernate通过减少手工编码量提高了开发效率,但对于某些特定场景下的性能优化可能不如iBatis灵活。 - **学习曲线**: - iBatis的学习曲线相对较平缓,易于上手。 - Hibernate由于其高级特性较多,学习起来有...

    Hibernate缓存深入详解

    在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是数据库数据的副本,当需要查询数据...

    hibernate_search.pdf

    - **结果处理**:考虑性能因素,控制结果集大小,使用结果转换器,并理解查询结果。 - **过滤器**:基于预定义条件筛选查询结果。 - **优化查询过程**:减少查询延迟,提高响应速度。 - **原生Lucene查询**:直接...

Global site tag (gtag.js) - Google Analytics