Hibernate性能优化技巧

本文详细总结了13个优化Hibernate性能的方法,包括数据库设计调整、HQL优化、API正确使用、主配置参数调整、映射文件优化、一级缓存管理、事务控制策略、以及对查询性能的影响等。重点介绍了如何在设计阶段综合考虑Java建模、数据库结构和业务需求,以提升系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行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的完美结合方案

转载于:https://my.oschina.net/u/2297250/blog/383543

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
资 源 简 介 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系, 详 情 说 明 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。 本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系,在此基础上重点分析了一种快速ICA实现算法一FastICA。物质的非线性荧光谱信号可以看成是由多个相互独立的源信号组合成的混合信号,而这些独立的源信号可以看成是光谱的特征信号。为了更好的了解光谱信号的特征,本文利用独立分量分析的思想和方法,提出了利用FastICA算法提取光谱信号的特征的方案,并进行了详细的仿真实验。 此外,我们还进行了进一步的研究,探索了其他可能的ICA应用领域,如音乐信号处理、图像处理以及金融数据分析等。通过在这些领域中的实验和应用,我们发现ICA在提取信号特征、降噪和信号分离等方面具有广泛的潜力和应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值