理论性问题:hibernate应用在复杂情况可能会大大降低性能吗

crowgns 2008-06-09 06:50:56
以前跟在sybase工作的师兄聊过,人家说“hibernate用起来是方便,但在大型应用中要慎用,一不小心就会降低系统的性能”。由于师兄是sybase的,所以这句话一直记在心中。
最近学习hibernate,很迷茫hibernate那里会大大降低对性能。在业务逻辑层和数据层加了层中间结构,肯定要慢点,但相对整体相应时间单纯加那一层的处理时间应该可以接受。
不用Hibernate的话手写jdbc把对象模型中属性拿出来填sql语句,变关系模型。hibernate自动的把对象模型属性填写sql语句,变关系模型,最终都是sql语句。而一对一,一对多的关系模型都很容易用对象模型表示,估计ihibernate不会有什么问题。唯一在于多对多关系,关系模型是用3张表,两张表示事物,1张表示两个事物关系。而对象模型是两个对象,其中每个对象都有另个对象的集合作属性。我现在还不能彻底理解Hibernate的多对多关系的映射,会不会是hibernate处理多对多关系不太好,可能影响性能?
请高手指教。
...全文
192 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
yami251139 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 jfheng 的回复:]
hibernate 绝对是一把宝刀,主要还是在于使用宝刀的人,会不会用了解不了解这把宝刀,

性能绝对不是问题,

性能主要注意的地方

1:一对多和多对多关联要用延迟,和inverse,尽量少用级联更新
2:查询多用左连接和左迫切连接
3:数据库设计的粒度要高

另外hql是非常好的查询语言可以替代sql,目前…
[/Quote]
那不行。。。。难道你要诱导我们走上一条不归路?
o(∩_∩)o...开玩笑。。。
crowgns 2008-06-11
  • 打赏
  • 举报
回复
感谢各种,我想我大约明白了,结贴。
sfq12345678 2008-06-10
  • 打赏
  • 举报
回复
支持,,,关注...
fffddd 2008-06-10
  • 打赏
  • 举报
回复
人家说“hibernate用起来是方便,但在大型应用中要慎用,一不小心就会降低系统的性能”。

你师兄说的是正确的。我们有一个项目深受其害。
sunyujia 2008-06-10
  • 打赏
  • 举报
回复
hibernate比较流行的性能问题就是n+1问题
这个不能怪hibernate,是程序员太懒了,其实可以自己搞定的,
hibernate就是api太多了,上手容易深入难,多对多的问题除了麻烦点也没什么
jfheng 2008-06-10
  • 打赏
  • 举报
回复
hibernate 绝对是一把宝刀,主要还是在于使用宝刀的人,会不会用了解不了解这把宝刀,

性能绝对不是问题,

性能主要注意的地方

1:一对多和多对多关联要用延迟,和inverse,尽量少用级联更新
2:查询多用左连接和左迫切连接
3:数据库设计的粒度要高

另外hql是非常好的查询语言可以替代sql,目前我做的统计查询都是用的 hql,希望大家还是多了解hql 你会发现你可以抛弃sql的
sunyujia 2008-06-10
  • 打赏
  • 举报
回复
就是因为延迟加载的原因,本来一条sql查出了n个对象,但是你调用每个对象的关联对象,则会执行单条sql n次.
一共执行sql数是n+1次,这个太影响性能了
解决方案
1.左连接(程序员用了hibernate一般连左连接都懒得写了)
2.二级缓存(具有一定的局限性,要求实时性不高的数据)


最好,楼主还是百度吧,查询hibernate性能调优就好.
crowgns 2008-06-10
  • 打赏
  • 举报
回复
请问你是什么情况降低了系统性能?复杂关系多表查询吗?
[Quote=引用 13 楼 fffddd 的回复:]
人家说“hibernate用起来是方便,但在大型应用中要慎用,一不小心就会降低系统的性能”。

你师兄说的是正确的。我们有一个项目深受其害。
[/Quote]
crowgns 2008-06-10
  • 打赏
  • 举报
回复
请问什么是N+1问题啊?
[Quote=引用 11 楼 sunyujia 的回复:]
hibernate比较流行的性能问题就是n+1问题
这个不能怪hibernate,是程序员太懒了,其实可以自己搞定的,
hibernate就是api太多了,上手容易深入难,多对多的问题除了麻烦点也没什么
[/Quote]
RomandAccessFile 2008-06-10
  • 打赏
  • 举报
回复
Hibernate 一点都不好,多表查询时.如果一个写不好,就会...呵!!!!!
我现在自己写了一个类Hibernate 的功能的东西,一样很好用,差键是有些Hibernate的功能你用不到,也不了解是什么意思,后期的研发.就会出现很多风险不可控制的问题,如果你是自己写出来的.那么风险就可控.
numen_wlm 2008-06-10
  • 打赏
  • 举报
回复
Hibernate是一把笨重的宝刀,不是每个人都舞得动的。 如果舞得动,那的确是把宝刀。
qq278095755 2008-06-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sunyujia 的回复:]
hibernate比较流行的性能问题就是n+1问题
这个不能怪hibernate,是程序员太懒了,其实可以自己搞定的,
hibernate就是api太多了,上手容易深入难,多对多的问题除了麻烦点也没什么
[/Quote]
这位朋友,能给解释下hibernate里的n+1次查询问题么?
longtramp 2008-06-09
  • 打赏
  • 举报
回复
hibernate有一级缓存和二级缓存用好了速度也不错
michaelwangwh 2008-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lisl2003 的回复:]
严重关注此帖!
[/Quote]
radeonxhl 2008-06-09
  • 打赏
  • 举报
回复
首先明确一点,用hibernate确实要比直接用jdbc慢,正常的情况下应该是稍慢一点,但在可以忍受的范围之内
具体原因可能是:
1.hibernate最终还是要通过jdbc去访问数据库,所以使用hibernate也就相当于在调用jdbc之前和之后多干了一些活,当然就要慢上一点了
JDBC:发送sql到db -> 接受db返回的数据 -> rs.next()该干吗干吗
hibernate:解析hql生成sql -> 发送sql到db -> 接受db返回的数据 -> 根据返回的数据构建对象 -> 把构建出来的对象组装成List返回(使用query.list()的时候)
头尾都多了点事,自然要慢上半拍了。而且,不难理解,如果表多,关联关系复杂,头尾多出来的事所占用的时间也会越多
2.hibernate可能会使用反射来操作类,反射其实性能是比较差的,尤其在老版本的JDK中,据说现在已经改进很多了
3.也许你只要更新整个类中的某2个字段,但你用hibernate只能更新整个类(即所有字段),或者你只需要查询某3个字段,但却得把整个类查询出来
4.其它的,暂时还没想到,大家补充啊

不过,就像楼上有人说的,hibernate允许自己写sql语句
所以,如果你发现某个hibernate查询性能特别低的话,可以自己写sql直接查
crowgns 2008-06-09
  • 打赏
  • 举报
回复
谢谢楼上!
yami251139 2008-06-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java2000_net 的回复:]
不要猜测,还是用起来再说。

当发生问题时,我们去解决它就行了。 而且hibernate允许你直接写SQL,人家留下了后门的。
[/Quote]
再用的时候的却碰到过运行速度慢的问题
不过那是设计上的原因
他设置了一个计数的view来读取某些关联的运算完后的结果
结果去读那个view的几个页面,每次都要进行一大堆的hql。。。。
最后改成直接写sql了。。。
所以再表多,关联多且烦的情况下,不如直接写个sql。。。
crowgns 2008-06-09
  • 打赏
  • 举报
回复
有熟悉Hibernate的前辈近来谈谈嘛...
crowgns 2008-06-09
  • 打赏
  • 举报
回复
缓存jdbc也有,处理完所有再提交不然回滚,也算是缓存机制吧。
lisl2003 2008-06-09
  • 打赏
  • 举报
回复
个人认为,Hibernate的缓存机制,在大型应用中应该提高系统性能才对。
不过这也只是我个人的看法,1楼说不要猜……
加载更多回复(2)

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧