hibernate性能调优

Java 领域 Hibernate 的 HQL 性能调优 Hibernate作为Java领域最流行的ORM框架之一,其HQL查询语言的性能直接影响应用的整体表现。本文旨在提供全面的HQL性能调优指南,涵盖从基础概念到高级优化技术的各个方面。本文首先介绍HQL的基本概念和原理,然后深入分析性能瓶颈,接着详细讲解各种优化技术,最后通过实际案例展示优化效果。:Hibernate提供的面向对象查询语言:对象关系映射技术:延迟加载策略N+1查询问题:ORM中常见的性能问题二级缓存:Hibernate提供的应用级缓存机制。 阅读详情

一。   inverse = ?

           inverse=false(default)

               用于单向one-to-many关联

               parent.getChildren().add(child) // insert child

               parent.getChildren().delete(child) // delete child

            inverse=true

                       用于双向one-to-many关联

                       child.setParent(parent); session.save(child) // insert child

                        session.delete(child)

             在分层结构的体系中

              parentDao, childDao对于CRUD的封装导致往往直接通过session接口持久化对象,而很少通过关联对象可达性

 

二。 one-to-many关系

                 单向关系还是双向关系?

                      parent.getChildren().add(child)对集合的触及操作会导致lazy的集合初始化,在没有对集合配置二级缓存的情况下,应避免此类操作

                    select * from child where parent_id = xxx;

           性能口诀:

                   1.   一般情况下避免使用单向关联,尽量使用双向关联

                   2.   使用双向关联,inverse=“true”

                   3.   在分层结构中通过DAO接口用session直接持久化对象,避免通过关联关系进行可达性持久化

 

 

三。many-to-one关系

          单向many-to-one表达了外键存储方

          灵活运用many-to-one可以避免一些不必要的性能问题

          many-to-one表达的含义是:0..n : 1,many可以是0,可以是1,也可以是n,也就是说many-to-one可以表达一对多,一对一,多对一关系

           因此可以配置双向many-to-one关系,例如:

                 1.    一桌四人打麻将,麻将席位和打麻将的人是什么关系?是双向many-to-one的关系

 

四。one-to-one

             通过主键进行关联

             相当于把大表拆分为多个小表

             例如把大字段单独拆分出来,以提高数据库操作的性能

             Hibernate的one-to-one似乎无法lazy,必须通过bytecode enhancement

 

五。集合List/Bag/Set 

             one-to-many

                1.     List需要维护index column,不能被用于双向关联,必须inverse=“false”,被谨慎的使用在某些稀有的场合

 

                2.       Bag/Set语义上没有区别

                3.        我个人比较喜欢使用Bag

            many-to-many

                1.       Bag和Set语义有区别

                2。    建议使用Set

 

六。集合的过滤

              1.   children = session.createFilter(parent.getChildren(), “where this.age > 5 and    this.age < 10”).list()

          针对一对多关联当中的集合元素非常庞大的情况,特别适合于庞大集合的分页:

                    session.createFilter(parent.getChildren(),“”).setFirstResult(0).setMaxResults(10).list();

 

七。继承关系当中的隐式多态

            HQL: from Object

              1.      把所有数据库表全部查询出来

               2.      polymorphism=“implicit”(default)将当前对象,和对象所有继承子类全部一次性取出

               3.       polymorphism=“explicit”,只取出当前查询对象

 

八。Hibernate二级缓存

               著名的n+1问题:from Child,然后在页面上面显示每个子类的父类信息,就会导致n条对parent表的查询:

                    select * from parent where id = ?

                    .......................

                    select * from parent where id = ?

               解决方案

                         1.       eager fetch

                          2.       二级缓存

 

九。inverse和二级缓存的关系

             当使用集合缓存的情况下:

                  1.      inverse=“false”,通过parent.getChildren()来操作,Hibernate维护集合缓存

                   2.     inverse=“true”,直接对child进行操作,未能维护集合缓存!导致缓存脏数据

                   3.     双向关联,inverse=“true”的情况下应避免使用集合缓存

 

十。Hibernate二级缓存是提升web应用性能的法宝

               OLTP类型的web应用,由于应用服务器端可以进行群集水平扩展,最终的系统瓶颈总是逃不开数据库访问;

 

            哪个框架能够最大限度减少数据库访问,降低数据库访问压力, 哪个框架提供的性能就更高;针对数据库的缓存策略:

                     1.         对象缓存:细颗粒度,针对表的记录级别,透明化访问,在不改变程序代码的情况下可以极大提升web应用的性能。对象缓存是ORM的制胜法宝。

                     2.        对象缓存的优劣取决于框架实现的水平,Hibernate是目前已知对象缓存最强大的开源ORM

                     3.         查询缓存:粗颗粒度,针对查询结果集,应用于数据实时化要求不高的场合

 

十一。应用场合决定了系统架构

一、是否需要ORM

Hibernate or iBATIS?

二、采用ORM决定了数据库设计

             Hibernate:

                     倾向于细颗粒度的设计,面向对象,将大表拆分为多个关联关系的小表,消除冗余column,通过二级缓存提升性能(DBA比较忌讳关联关系的出现,但是ORM的缓存将突破关联关系的性能瓶颈);Hibernate的性能瓶颈不在于关联关系,而在于大表的操作

             iBATIS:

                     倾向于粗颗粒度设计,面向关系,尽量把表合并,通过表column冗余,消除关联关系。无有效缓存手段。iBATIS的性能瓶颈不在于大表操作,而在于关联关系。

 

 

总结:

      性能口诀

                1、使用双向一对多关联,不使用单向一对多

                2、灵活使用单向多对一关联

                3、不用一对一,用多对一取代

                4、配置对象缓存,不使用集合缓存

                5、一对多集合使用Bag,多对多集合使用Set

                6、继承类使用显式多态

                7、表字段要少,表关联不要怕多,有二级缓存撑腰

后端开发中 Hibernate 的性能调优秘籍 通过本文的系统性优化方案,某电商平台将订单处理吞吐量从 1200 TPS 提升至 6500 TPS,数据库 CPU 负载下降 40%。实际效果因业务场景有所差异,建议结合具体业务指标进行调优。A: 读多写少用 READ_ONLY,频繁更新用 READ_WRITE,强一致性需求用 TRANSACTIONAL。A: 在 Session 关闭后访问延迟加载的关联对象。 阅读详情

相关推荐

Java 项目中 Hibernate 的性能调优秘籍

Hibernate作为Java生态中最流行的ORM框架之一,虽然极大地简化了数据持久化操作,但不当使用往往会导致严重的性能问题。本文旨在为开发人员提供一套完整的Hibernate性能调优方法论,涵盖从基础配置到高级优化的各个方面。文章首先介绍Hibernate的核心工作原理,然后深入分析各种性能影响因素,接着提供具体的调优策略和实战案例,最后讨论未来发展趋势和常见问题解答。ORM:对象关系映射,将面向对象语言中的对象与关系数据库中的表建立对应关系Session。

Java大师兄的博客 856

Hibernate如何提升数据库查询的性能

数据库查询性能的提升也是涉及到开发中的各个阶段,在开发中选用正确的查询方法无疑是最基础也最简单的。 SQL语句的优化 使用正确的SQL语句可以在很大程度上提高系统的查询性能。获得同样数据而采用不同方式的SQL语句在性能上的差距可能是十分巨大的。 由于Hibernate是对JDBC的封装,SQL语句的产生都是动态由Hibernate自动完成的。Hibernate产生SQL语句的方...

www.v5qq.com的技术博客 881

Java 开发:Hibernate 的性能调优工具推荐

本文旨在为 Java 开发者提供全面的 Hibernate 性能调优工具推荐。详细介绍各类工具的特点、适用场景和使用方法,帮助开发者根据项目需求选择合适的工具进行性能优化。范围涵盖了常见的 Hibernate 性能调优工具,包括开源和商业工具,并结合实际案例进行说明。本文将按照以下结构展开:首先介绍 Hibernate 性能调优的核心概念和相关联系;接着详细讲解各类性能调优工具的核心算法原理和具体操作步骤;通过数学模型和公式对工具的性能指标进行分析;

Java大师兄的博客 618

Hibernate程序性能优化的考虑要点

本文依照HIBERNATE帮助文档,一些网络书籍及项目经验整理而成,只提供要点和思路,具体做法可以留言探讨,或是找一些更详细更有针对性的资料。初用HIBERNATE的人也许都遇到过性能问题,实现同一功能,用HIBERNATE与用JDBC性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度。大体上,对于HIBERNATE性能调优的主要考虑点如下: 数据库设计调整

824

Java 领域 Hibernate 的查询性能调优工具

在 Java 开发中,Hibernate 是一个广泛使用的对象关系映射(ORM)框架,它极大地简化了数据库操作。然而,随着应用规模的扩大和数据量的增加,Hibernate 查询性能可能会成为瓶颈。本文章的目的是深入介绍用于 Hibernate 查询性能调优的工具,帮助开发者提高 Hibernate 查询的效率,范围涵盖了常见的性能调优工具、其原理、使用方法以及在实际项目中的应用。本文将首先介绍与 Hibernate 查询性能调优相关的核心概念,然后详细讲解核心算法原理和具体操作步骤。

AI开发架构师 960

Hibernate性能调优

Hibernate性能调优

[总结]hibernate性能调优有感

    今天在写Hibernate应用程序的时候发现一个程序需要27秒才能加载上来,并且CPU占用情况比较大,MAX=27890kb,MiX=13469kb    起初想用一个同步的JProgressBar东西来实现和用户交互并且数据库加载数据完全用线程池来实现,觉得用多线程来实现应该比较快吧,可惜我错了,本来Swing就不是线程安全的,果然不出我所料,出来N个

翱翔天空的专栏 2085

hibernate性能优化

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

hibernate性能调优: 一

1.引言 Hibernate是最流行的对象关系映射(ORM)引擎之一,它提供了数据持久化和查询服务。 在你的项目中引入Hibernate并让它跑起来是很容易的。但是,要让它跑得好却是需要很多时间和经验的。 通过我们的使用Hibernate 3.3.1和Oracle 9i的能源项目中的一些例子,本文涵盖了很多Hibernate调优技术。其中还提供了一些掌握Hiberna

草原孤狼的专栏 850

无人驾驶-2024-09-智能驾驶与机器视觉09:视觉与多传感器融合

从本章开始,我们将详细介绍视觉与多传感器融合技术。自动驾驶中常用的传感器都有其优势和局限性,单一传感器无法应对复杂的驾驶场景。多传感器融合技术旨在综合利用不同的传感器优势,提升感知的精度和鲁棒性。本章首先介绍多传感器融合的相关概念,之后详细介绍典型的融合方法。

u013250861的博客 593

802.1AS时间同步机制深度解析:从Sync报文到多域冗余设计

本文深度解析了802.1AS时间同步机制,从Sync与Follow_Up报文的核心交互原理入手,详细阐述了其如何通过精确的时钟频率比测量、链路延迟计算和驻留时间补偿来实现微秒乃至纳秒级同步。文章进一步探讨了802.1AS-2020版本引入的多时钟域冗余设计,为构建高可靠的车载TSN网络提供了关键见解和实战配置指南。

pytorch8learner的博客 460

Hibernate性能调优和最佳实践

为什么80%的码农都做不了架构师?>>> ...

weixin_33725722的博客 342

三菱FX3U PLC红绿灯ST编程实战:从基础逻辑到急停功能完整实现

本文以十字路口红绿灯控制为例,详细讲解了三菱FX3U PLC使用ST编程的完整实战过程。内容涵盖从基础时序逻辑、状态机设计,到急停功能、黄灯闪烁、昼夜模式切换等高级功能的实现,并提供了代码优化与调试技巧,帮助工程师掌握结构化文本在工业控制中的清晰、结构化应用。

weixin_29070861的博客 533

如何进行HIBERNATE性能调优

大体上,对于HIBERNATE性能调优的主要考虑点如下: Ø 数据库设计调整 Ø HQL优化 Ø API的正确使用(如根据不同的业务类型选用不同的集合及查询API) Ø 主配置参数(日志,查询缓存,fetch_size, batch_size等) Ø 映射文件优化(ID生成策略...

chuchen7021的博客 152

5分钟看懂LTE注网全流程:从PLMN选择到小区驻留的log分析技巧

本文深入解析了LTE终端从开机到成功驻留小区的完整流程,重点分享了基于QXDM和QCAT工具的log分析实战技巧。文章详细拆解了PLMN选择、System/Band扫频、小区搜索与同步、系统消息解析及驻留等关键步骤,并提供了高频问题场景的排查思路,帮助网络优化工程师快速定位终端侧、射频环境或网络配置问题。

app77的博客 432

【企业微信自建应用-前端篇】企业微信自建应用开发流程详细介绍

最近接到需求,需要我在企业微信端自建一个应用,用来接受PC端派发的工单,告警,公告等内容。这里写一个帖子汇总一下我经历的全流程开发,当然这是基础的流程啊。因为功能要求也不高。后面如果开发更多的东西再补充。

weixin_44265726的博客 9398

hibernate性能调优(上)

目录(?)[-] Hibernate优化-引言Hibernate优化-Hibernate性能调优Hibernate优化-监控和剖析 监控SQL生成查看Hibernate统计剖析 Hibernate优化-调优技术 业务规则与设计调优继承映射调优 每个类层次一张表每个子类一张表每个具体类一张表使用隐式多态实现每个具体类一张表 领域对象调优 POJO调优POJO之间关联

xo_zhang的专栏 999

视频动作识别、行为识别、时空动作检测数据集整理(持续更新)

动作、行为、事件 在计算机视觉的相关研究中,人体的动作、行为识别是一个基础研究问题。但目前识别、检测人类的动作/行为仍然是一个巨大的挑战。这里整理下当前相关的细分任务、数据集和开源代码(持续更新中)。

人工智能算法与工程实践 3万+

【JAVA】Java高级:JPA与Hibernate优化:JPA与Hibernate的底层实现与性能调优

JPA和Hibernate作为Java领域中最流行的ORM框架,为开发者提供了便捷的对象关系映射能力。然而,在实际应用中,开发者需要了解它们的底层实现和性能调优技巧,以确保应用程序的性能和稳定性。通过合理使用缓存、优化SQL语句、批量操作、连接池管理、事务管理以及监控和调优等方法,可以显著提高数据库操作的性能。

thinking_chou的专栏 1293

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 462

python代码实现了一个基于图注意力网络(GAT)和长短期记忆网络(LSTM)的股票成交量预测模型

自定义数据集类:定义了类,继承自。该类用于生成股票数据的时间序列样本,每个样本包含一个长度为seq_length的时间序列和对应的目标成交量。数据加载器:使用DataLoader对数据集进行批量加载,设置批量大小为 64,并开启数据打乱功能。GAT - LSTM 模型:定义了GAT_LSTM类,继承自。该模型结合了 GAT 和 LSTM 两种神经网络:GAT 部分:使用GATConv处理全局图特征,捕获股票之间的相互关系。LSTM 部分:使用nn.LSTM处理时间序列数据,捕捉时间序列的动态变化。

huanghm88的专栏 424

(转)hibernate 性能调优

Hibernate是 最流行的对象关系映射(ORM)引擎之一,它提供了数据持久化和查询服务。在你的项目中引入Hibernate并让它跑起来是很容易的。但是,要让它跑得 好却是需要很多时间和经验的。通过我们的使用Hibernate 3.3.1和Oracle 9i的能源项目中的一些例子,本文涵盖了很多Hibernate调优技术。其中还提供了一些掌握Hibernate调优技术所必需的数据库知识。 ...

dadafangfang的专栏 210

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: JAVA日期时间小结
QJC13
博客等级 码龄19年 9粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值