文档章节

Hibernate性能优化技巧

成长中的菜鸟
 成长中的菜鸟
发布于 2015/03/06 17:57
字数 2354
阅读 32
收藏 0

在进行Hibernate性能优化时,需要从以下几个方面进行考虑:

数据库设计调整。

HQL优化。

API的正确使用(如根据不同的业务类型选用不同的集合及查询API)。

主配置参数(日志、查询缓存、fetch_size、batch_size等)。

映射文件优化(ID生成策略、二级缓存、延迟加载、关联优化)。

一级缓存的管理。

针对二级缓存,还有许多特有的策略。

事务控制策略。

数据的查询性能往往是影响一个应用系统性能的主要因素。对查询性能的影响会涉及到系统软件开发的各个阶段,例如,良好的设计、正确的查询方法、适当的缓存都有利于系统性能的提升。

系统性能的提升设计到系统中的各个方面,是一个相互平衡的过程,需要在应用的各个阶段都要考虑。并且在开发、运行的过程中要不断地调整和优化才能逐步提升系统的性能。

设计阶段的考虑问题

一个良好的数据库结构有利于系统性能的提升。这里所说的良好结构的数据库并不单纯是指满足数据库设计范式的数据库结构。这是因为,按照数据库范式所设计的数据库只能说在结构上是最优的,没有冗余数据等问题,但在生产过程中并不一定能获得最佳的性能。有时候适当地增加一些数据的冗余虽然增加了数据维护的难度,但可以极大地简化业务的查询,提高数据检索的效率。

在使用Java访问数据库的时候,还存在另外一个问题,就是面向对象的Java语言与关系型数据库之间的矛盾。在这两者之间必然要涉及到一个相互转化的问题,对于这个问题是否能够正确的处理也是影响系统性能的一个重要因素。

综合以上提出的各种问题,在数据库设计阶段要综合考虑以下三个方面的因素。

Java建模

在建立Java对象模型的时候,要考虑数据库持久化的方便性,所建立的Java对象模型应该可以很容易地被数据所存储,并且数据库中表的结构也是越简单越好。

数据库结构

在设计数据库结构的时候也要考虑到是否可以很容易地用Java对象去表示。这里并不是简单的一个表对应一个对象的直接转换,更重要的是转换后的Java对象应该能够描述出数据间的关系。

所以在设计阶段,对于Java对象和数据库结构要进行综合考虑,也就是可以从两个方向进行考虑,毕竟两者之间不是一个时代的产物,设计的结果应该在两者之间达到一个平衡,虽然不能每一方都达到最优,但也不能造成有一方结构很差的情况。就像装水的木桶,最矮的板子决定水桶的容量。

业务需求

前面两个因素都是纯技术方面的考虑,在设计的过程中,更重要的是要紧扣业务需求。这是因为任何的软件系统都是以业务为中心的,那么对于系统的设计也不例外,在设计的阶段就应该考虑业务实现的方便性以及执行的效率。一个良好的结构设计不但使业务功能的实现变得非常容易并且可以避免很多复杂的操作,还可以达到提升系统性能的目的。

设计阶段是整个应用系统开发中的根基,其对软件的影响仅次于对系统需求的把握。所以在设计阶段应该对整个软件系统有一个整体的考虑,这里所说的具体设计也只是设计阶段中的很少的一部分,综合考虑多方面的因素才能达到更佳的性能。

 

文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:

一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session. clear()或者session. evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象。

二、对大数据量查询时,慎用list()或者iterator()返回查询结果,

<1>. 使用List()返回结果时,Hibernate会所有查询结果初始化为持久化对象,结果集较

大时,会占用很多的处理时间。

<2>. 而使用iterator()返回结果时,在每次调用iterator.next()返回对象并使用对象时,

Hibernate才调用查询将对应的对象初始化,对于大数据量时,每调用一次查询都会花

费较多的时间。当结果集较大,但是含有较大量相同的数据,或者结果集不是全部都会

使用时,使用iterator()才有优势。

<3>. 对于大数据量,使用qry.scroll()可以得到较好的处理速度以及性能。而且直接对结

果集向前向后滚动。

三、对于关联操作,Hibernate虽然可以表达复杂的数据关系,但请慎用,使数据关系较为

简单时会得到较好的效率,特别是较深层次的关联时,性能会很差。

四、对含有关联的PO(持久化对象)时,若default-cascade="all"或者 “save-update”,新增PO时,请注意对PO中的集合的赋值操作,因为有可能使得多执行一次update操作。

五、在一对多、多对一的关系中,使用延迟加载机制,会使不少的对象在使用时才会初始化,这样可使得节省内存空间以及减少数据库的负荷,而且若PO中的集合没有被使用时,就可减少互数据库的交互从而减少处理时间。

六、对于大数据量新增、修改、删除操作或者是对大数据量的查询,与数据库的交互次数是决定处理时间的最重要因素,减少交互的次数是提升效率的最好途径,所以在开发过程中,请将show_sql设置为true,深入了解Hibernate的处理过程,尝试不同的方式,可以使得效率提升。

七、Hibernate是以JDBC为基础,但是Hibernate是对JDBC的优化,其中使用Hibernate的缓冲机制会使性能提升,如使用二级缓存以及查询缓存,若命中率较高明,性能会是到大幅提升。

八、Hibernate可以通过设置hibernate.jdbc.fetch_size,hibernate.jdbc.batch_size等属性,对Hibernate进行优化。

九、不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。

十、Dynamic Update 如果选定,则生成Update SQL 时不包含未发生变动的字段属性,这样可以在一定程度上提升SQL执行效能.Dynamic Insert 如果选定,则生成Insert SQL 时不包含未发生变动的字段属性,这样可以在一定程度上提升SQL执行效能

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

十二、在one-to-many 关系中,将many 一方设为主动方(inverse=false)将有助性能的改善。

十三、由于多对多关联的性能不佳(由于引入了中间表,一次读取操作需要反复数次查询),因此在设计中应该避免大量使用。

还可以看看Struts与Hibernate的完美结合方案

本文转载自:http://developer.51cto.com/art/200906/127424.htm

成长中的菜鸟
粉丝 5
博文 37
码字总数 30913
作品 0
房山
程序员
私信 提问
Hibernate性能优化2( 转)

关键字: hibernate 本文依照HIBERNATE帮助文档,一些网络书籍及项目经验整理而成,只提供要点和思路,具体做法可以留言探讨,或是找一些更详细更有针对性的资料。 初用HIBERNATE的人也许都遇...

九爷
2011/05/14
154
0
Hibernate性能优化3( 转)

作者:Robbin Fan 一。 inverse = ? inverse=false(default) 用于单向one-to-many关联 parent.getChildren().add(child) // insert child parent.getChildren().delete(child) // delete chi......

九爷
2011/05/14
187
0
Hibernate OGM 4.1.0.Beta8 发布,性能提升

Hibernate OGM 4.1.0.Beta8 发布,此版本提升了性能,减少了数据往返存储,优化数据存储的乐观锁支持,提供原子性的 find-and-update 操作。 此版本同时也解决了一些 bug,还有一些 hood 下的...

叶秀兰
2014/10/31
2.2K
8
Spring/Hibernate 应用性能优化的7种方法

对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能。此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法。本文系...

OneAPM蓝海讯通
2015/10/27
78
0
Hibernate通用序列化方案,避免延迟加载问题及序列化整个数据库至

在使用Ajax: Hibernate Entity => json, Flex RemoteObject: Hibernate Entity => ActionScript Object的过程,经常碰到如下问题: 问题: 1.Hibernate碰到延迟加载的属性访问时如果session被......

baisou
2013/09/13
933
0

没有更多内容

加载失败,请刷新页面

加载更多

官方来源的 Duo Mobile App 解决了我的 Network Difficulties 问题

https://help.duo.com/s/article/2094?language=en_US 我利用百度搜索下载了一个 Duo Mobile App (由于 Google Play)在大陆不可用。 在扫描旧手机上的 Duo Mobile App 的二维码时, 显示出错...

圣洁之子
6分钟前
1
0
Zabbix监控Mysql容器(Docker容器)主从是否存活

1、在Zabbix Web端创建模板 2、为该模板创建监控项 3、创建触发器 4、在zabbix-agent端操作 在/etc/zabbix/zabbix_agentd.d新建customize.confw文件 内容如下 UserParameter=mysql.replicat...

abowu
7分钟前
1
0
基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础...

大涛学长
13分钟前
1
0
设计模式之:外观模式和桥接模式

作者:DevYK 链接:https://juejin.im/post/5d7e01f4f265da03b5747aac 外观模式 介绍 外观模式 (Facade) 在开发过程中的运用评率非常高,尤其是在现阶段,各种第三方 SDK “充斥” 在我们周边...

Java架构Monster
14分钟前
1
0
人证合一核验设备

人脸身份验证机,人证合一设备1:N如我们现在在车站或一些重要的场所如步行街、城中村等人流密集的场所应用的人脸识别布控系统,其特点是动态和非配合。所谓的动态也就是识别的不是照 片,不是...

非思丸智能
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部