[转]hibernate性能问题

本文针对Hibernate框架在实际项目中遇到的性能问题进行了深入探讨,并分享了解决N+1查询、一对一双向关联懒加载及大批量数据插入等问题的具体案例。

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

[b][size=medium]本贴作者 xyz20003[/size][/b]

大多数反对使用hibernate的同志,张口必说hibernate有性能问题,不好调优,对DBA不友好。可从来没有任何一个人具体指出hibernate哪里有性能问题,为什么不能调优,哪方面对DBA不友好。

大家去面试过,有些同志也有面试别人的经验,应该明白一点:务虚很容易。什么性能啦,什么并发啦,什么管理啦。每个人张口都可以说出很多来,但是一旦开始玩真格的,那些没有实际经验的就会原型毕露了。不是我心眼坏,戴着有色眼镜去看人,而是社会复杂,害人之心不可有,防人之心不可无。精准的批评是一种鞭策,有则改之无则加勉。关键在于是否存在“三人成虎”的情况呢?

让咱们化繁为简吧,只问一句话:“阁下认为hibernate有性能问题,sql无法调优。”这个想法是切身体会呢?还是以讹传讹而来呢?如果是切身体会,那么恳请阁下受累一下,劳烦您把出现的问题稍微详细的描述一下,如果有可能的话,最好还能和大家稍微讨论一下这个问题出现的原因,以及解决方法。

下面算是我在实际项目中遇到的一些性能出现问题的场景,以及解决的方法,想必大家用过hibernate都应该耳闻能熟了,但是为了避免自己出现上面所说的“空口无凭”,还是斗胆拿出来献丑了。

1.N+1
场景描述:产品product和产品分类product_category两张表,多对一关系。查询产品列表时,可能出现N+1问题。
解决方法:
1:使用fetch抓取,select p from Product p join fetch p.category c
2:使用map直接搜索需要的列,select new Map(p.id as id, p.name as name, p.category.name as categoryName) from Product p

2.1:1无法lazy
场景描述:申请表头和三张申请子表是一对一关系,其中子表对主表的关联可以实现延迟加载,主表无法延迟加载3个子表。造成每次读取主表以后,都同时发送三个sql查询三个子表的信息。
解决方法:一对一关系的一方无法延迟加载是hibernate本身的bug,虽然可以使用instrument解决,但是要对字节码进行静态加强,不如直接改成多对一关联。

3.大批量插入数据
场景描述:导入数据过多时,一级缓存会迅速膨胀,有时导致内存溢出。
解决方法:我们用的方法是每隔一定数目(200条)就执行session.flush()和session.clear(),现在看来还是应该是用jdbc批量插入,或者应该直接导入到数据库里。

回过头来看一下,平常遇到的问题,基本都是因为N+1以及延迟加载使用的太随意造成的,我们对二级缓存的使用也不多,只是把一些常用的数据字典一次性缓存到内存里了。剩下的批量插入,批量更新,确实不应该依靠hibernate来解决,这时候幸好我们还有其他选择,使用hibernate也可以满足我们80%以上的需求。

下面就期待同仁提出实例反证了,向大家多多学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值