影响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>
7、JavaBean的写法对性能的影响<o:p></o:p>
注意:在编写代码的时候请,对将POJO的getter/setter方法设定为public,如果设定为private,Hibernate将无法对属性的存取进行优化,只能转而采用传统的反射机制进行操作,这将导致大量的性能开销(特别是在1.4之前的Sun JDK版本以及IBM JDK中,反射所带来的系统开销相当可观)。
8、缓存技术对性能的影响<o:p></o:p>
如果,业务中需要对某信息经常反复性的查询,但是却不进行修改,或者是很少进行修改,那么,利用缓存机制,也是一种不错的选择。我还没用上,以后尝试下。引入Cache机制的难点是如何保证内存中数据的有效性,否则脏数据的出现将给系统带来难以预知的严重后果。Hibernate 中实现了良好的Cache 机制,我们可以借助Hibernate 内部的Cache迅速提高系统数据读取性能。需要注意的是:Hibernate做为一个应用级的数据访问层封装,只能在其作用范围内保持Cache中数据的的有效性,也就是说,在我们的系统与第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。
9、延迟加载对性能的影响<o:p></o:p>
延迟加载,一般我们都会选择,因为可以节省一部分性能。如,示例中user对象在加载的时候,会同时读取其所关联的多个地址(address)对象,对于需要对address进行操作的应用逻辑而言,关联数据的自动加载机制的确非常有效。但是,如果我们只是想要获得user的性别(sex)属性,而不关心user的地址(address)信息,那么自动加载address的特性就显得多余,并且造成了极大的性能浪费。为了获得user的性别属性,我们可能还要同时从数据库中读取数条无用的地址数据,这导致了大量无谓的系统开销。
10、初始化对性能的影响<o:p></o:p>
关于事物,利用Hibernate来完成启动和提交UserTransaction的功能的确可以,但这样的做法比原本直接通过InitialContext获取UserTransaction 的做法消耗了更多的资源,得不偿失。
还有其他一些常用的资源也可以在系统初始化时完成,这样,系统启动时间慢,但是运行会快一些。
11、hibernate的锁机制的选择对性能的影响<o:p></o:p>
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。optimistic-lock="version"其中通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现,同时也是Hibernate中,目前唯一在数据对象脱离Session发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择version方式作为Hibernate乐观锁实现机制。
<o:p> </o:p>
12、Session管理对性能的影响:<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>
分享到:
相关推荐
Hibernate性能优化Hibernate性能优化Hibernate性能优化Hibernate性能优化Hibernate性能优化
设计好的hibernate与设计不好的hibernate性能差别巨大,如何改善hibernate的性能是合理使用hibernate的关键
Hibernate性能调优
珍藏的hibernate性能优化,如果对hibernate进行优化,很详细,是工作和面试的好助手
Hibernate提升性能Hibernate提升性能Hibernate提升性能Hibernate提升性能
Hibernate性能优化研究.pdf..............
Hibernate性能优化策略.详细描述了java性能优化的各种策略高清
详见博客 http://blog.csdn.net/hanlin0605/article/details/54834717
中取出的记录条数,一般设置为30、50、100.Oracle数据库的JDBC驱动默认的Fetch Size=15,设置Fetch Size设置为:30、50,性能会有明显提升,如果继续增大,超出100,性能提升不明显,反而会消耗内存。 即在...
hibernate性能优化.dochibernate性能优化.doc
Hibernate3性能优化Hibernate3性能优化Hibernate3性能优化Hibernate3性能优化
hibernate_性能优化
很多人都说Hibernate性能好无非是它些cache功能姑且不讨论是否有这样最佳实战(希望国内有人能提出 best practices,或者pattern),单从cache本身来说也并不是有了就好否则也不会出现分布式cache就像长辈成天 唠叨这...
Hibernate性能优化共9页.pdf.zip
Hibernate的orm映射固然方便,但是数据达到一定量时,也会遇到一些瓶颈,这时hibernate的优化就显得异常重要,本文档含有多种方式的优化方案,方便的h话你可以关注一下!
初用HIBERNATE的人也许都遇到过性能问题,实现同一功能,用HIBERNATE与用JDBC性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度。