您的位置:程序门 -> java -> 框架、开源



再谈hibernate 项目性能的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


再谈hibernate 项目性能的问题[已结贴,结贴人:sun94510451]
发表于:2007-01-23 16:22:20 楼主
我开发的一个产品汽车零配件搜索系统,框架选择:hibernate+spring+dwr,数据库设计的时候有很多关联关系(如一对多、多对多),开始用hibernate的时候取道主表的结果集后,连带子表的结果集一起能得到,用起来感觉很爽,一个hql就能得到很多,再也不需要用以前的联合查询,感觉真的解脱了,hibernate3.0中效果就设置了lazy= "false "   inverse= "true "   等。

现在客户那边导入的数据量上百万,系统性能急剧下降,查询速度要几分钟甚至几十分钟才能得结果,控制台sql暴多,我也知道我的orm设计不是很好,lazy这东东也比较讨厌,设成true后关联数据取不到,页面报错,以前用jdbc、ibatis开发大系统,性能还过的去,目前该项目已开发完毕,面对这样情况本人郁闷透顶!hibernate请高手们给点改进的方法或建议,谢谢大家!!
发表于:2007-01-23 17:09:281楼 得分:5
lazy使用true,同时使用事务控制hibernate的session。保证在同一个session中调用该对象的关联属性就可以了。
发表于:2007-01-23 17:20:302楼 得分:3
幸好我们设计时没有使用hibernate自带的关联,而是自己控制的.

不过数据量还不大,不知以后会怎么样.
发表于:2007-01-24 17:14:193楼 得分:5
hibernate做复杂的大型应用有很多性能问题

按照你这种情况

最好把影响性能很多的地方改写成存储过程让hibernate直接调用

那样比他自己解析生成sql语句性能要好很多。
发表于:2007-01-24 17:16:154楼 得分:5
对一对多关联,最好不要采用面向对象set封装的形式,我宁愿自己在dao里写两条sql语句也不愿让他自动生成n+1条语句。
发表于:2007-01-24 19:29:105楼 得分:5
学习!
发表于:2007-01-24 20:01:546楼 得分:30
1.   使用threadlocal
2.   设置缓存。
3.   反思数据库的设计是否合理。
4.   再看看hibernate的书。  
5.   查询的时候,   使用索引了吗?    
6.   使用缓存了吗?

建议楼主学习以下知识:
hibernate,lucene,   ehcache/oscache.
还有,如何使用面向对象的方法设计db。

不是我迷信hibernate,好的设计师手里,   hibernate+   tomcat
就可以让   weblogic+   oracle   下岗。
发表于:2007-01-24 20:18:487楼 得分:5
楼上说的是真是假啊,hibernate真有那么牛吗?
发表于:2007-01-24 20:57:008楼 得分:5
我也遇过这问题
hibernate的性能有时太差
发表于:2007-01-24 21:03:289楼 得分:2
不是我迷信hibernate,好的设计师手里,   hibernate+   tomcat
就可以让   weblogic+   oracle   下岗。
===========================================================
哪跟哪啊
发表于:2007-01-24 23:25:3210楼 得分:5
不是我迷信jdbc,在优秀的设计师手里,jdbc可以让hibernate下岗
发表于:2007-01-25 17:36:0011楼 得分:0
楼上的,就是迷信jdbc的那位,你认为hibernate比jdbc差在哪里呢?

是速度问题吗?
不错,jdbc的语句确实比hibernate生成的要明了,但是在海量数据
面前,jdbc就很快吗?用   like   %foo%   语句在百万数据中查询,jdbc
高手中的高高手,就有好的办法吗?

现在的软件开发,高手多不多?多,这是肯定的!但是你见哪个高手
在项目中不使用持久层?直接jdbc往上写?

如果认为数据库方面,只要jdbc写的好,就万事大吉,那么你的经理
也可以认为你应该完事走人了。索引,批处理,存储过程,缓存,这
些都没关系吗?

不要跟我说数据库的索引怎么怎么好用。like查询是无视数据库索引
的。有的人用了hibernate,感觉慢,就骂h不好。请反思下,你是否
在用面向过程的方法设计表结构?是否在查询中大量的使用了like这
样的jdbc杀手?是否使用了第三方包来实现数据库的全文索引?是否
在关键步骤使用了缓存方案?是否合理的使用了存储过程?
发表于:2007-01-26 08:59:5512楼 得分:3
不是只有hibernate才能用缓存的

jdbc一样可以用

关系数据库和面向对象的方式始终有距离。

hibernate为了这段距离做了不少努力,可惜性能一直是个诟病。
发表于:2007-01-26 10:14:5813楼 得分:5
我同意hbwhwang(【生病了,好好休息中...】)   的看法,越来越多的构架让java程序员越来越懒,让我们离计算机本身越来远,离算法和性能考虑的越来越少,hibernate要生成一个sql首先要在内存里生成多少个临时string或者stringbuffer,为什么大家写的程序一谈到并发就很没底气.
发表于:2007-01-26 10:16:3114楼 得分:0
cache很多,你构架设计的好,就可以加上,自己些个也可以,jive就是个很好的例子
发表于:2007-01-26 12:00:2115楼 得分:0
我不太明白,hibernate的性能,到底差在哪里???

楼上的朋友能不能举个例子说下?

据我观察,hibernate生成的sql语句,要比一般程序员写的都好。
而且可以针对各个数据库,进行不同的优化。

计算机说白了就是个工具。如果离计算机近才是正确的,是不是应该用1001的
机器码写程序了?
java在内存里生成sql的string和stringbuffer,在当今的系统硬件面前可以
忽略不计。而且,string用的合适与否,跟并发没关系吧?全国的java程序员里,
敢说自己用的好thread和synchronize的都没多少。要不咱们国产的中间件也不用
到前几天才迟迟露面了。
发表于:2007-01-26 12:53:4716楼 得分:3
我没资格评价,向各位大师学习下,
发表于:2007-01-26 15:47:1117楼 得分:0
随便给sg552(:))   举个例子吧。
假设有一个用户表,10个字段,其中主键是userid,还有一个username。现在就让你列示所有的userid和username,你用hibernate怎么做?是不是这样写hql "select   u   from   user   u "?
如果你的答案是“yes”,那就已经有效率问题了!
为什么?因为我只需要你取2个字段,用到的sql是 "select   userid,username   from   user ",而hibernate产生的sql是 "select   userid,username,c1,....,c8   from   user "!请不要小看这多余的8个字段!首先它消耗了数据库产生数据的时间,消耗了从数据库服务器传输到应用服务器的时间,浪费了应用服务器产生对象的时间,浪费了垃圾回收的时间,同时还虚耗了很多内存!如果你的user表不超过10k条数据,恭喜你,你不会遇到麻烦。可是如果user表有10m条数据呢?如果你见过哪个“高手”在这种情况下还是在用hibernate,请你无论如何都要提醒一下这位“高手”--存在效率问题!
当然上面的答案你可以说“no”,因为你也可以这样写hql "select   u.userid,u.username   from   user   u ",这说明你考虑了效率问题,可是很遗憾地告诉你,select出来的结果被放到object[]里面了,你要用的话,还得处理这个object[],还不如我直接处理resultset,很明显比hibernate少了一次处理过程!不过这里的效率损失倒真的微不足道。
发表于:2007-01-26 16:08:3318楼 得分:5
还好我现在做的项目数据量都是很小的,没必要考虑太多的问题,用hibernate比较爽,当然一些复杂的sql语句也是会写在hbm里面的
发表于:2007-01-26 17:16:2619楼 得分:0
只是取两个字段,要求严格的话,是肯定使用 "select   u.userid,   u.username   from   user   u "的。  

又因为or映射,所以是肯定要使用object[]数组。


如果hbwhwang(【生病了,好好休息中...】)     这位朋友只是因为hibernate比rs多了
一个object[],就说hibernate可以下岗了???

那么,我只能说,希望你一路顺风~
发表于:2007-01-26 17:24:2020楼 得分:0
你不要说你用hibernate就是只用native   sql!
发表于:2007-01-26 17:49:2921楼 得分:1
坐下看高手论战
发表于:2007-01-26 18:06:4622楼 得分:0
我现在也没听到你这句话的理由。

hbwhwang(【生病了,好好休息中...】)   (   一星(中级))
不是我迷信jdbc,在优秀的设计师手里,jdbc可以让hibernate下岗


而且上面你帖子的解释:
你也可以这样写hql "select   u.userid,u.username   from   user   u ",这说明你考虑了效率问题,可是很遗憾地告诉你,select出来的结果被放到object[]里面了,你要用的话,还得处理这个object[],还不如我直接处理resultset,很明显比hibernate少了一次处理过程!不过这里的效率损失倒真的微不足道。

也让我觉得很好笑。
发表于:2007-01-26 19:24:4723楼 得分:0
其实那句话完全是开玩笑说的,因为上面有一句“不是我迷信hibernate,好的设计师手里,   hibernate+   tomcat   就可以让   weblogic+   oracle   下岗。”(我现在才发现是你说的)
不瞒你说,我看到你这句话差点笑岔了气,因为这完全不可类比的东西被你硬是凑合到了一起。就象我前面那个兄弟说的“哪跟哪啊”。所以我就来了这么一句。
===
要我说出“不是我迷信jdbc,在优秀的设计师手里,jdbc可以让hibernate下岗”的理由,没问题!不过请你先说出“不是我迷信hibernate,好的设计师手里,   hibernate+   tomcat   就可以让   weblogic+   oracle   下岗。”的理由。
===
这个要求不算过分吧,呵呵
发表于:2007-01-26 20:33:3924楼 得分:0
:)       我认为没必要了。   这个帖子越扯越远。

得罪之处,请多多包涵。
发表于:2007-01-26 20:39:2525楼 得分:3
数据库多次连接或者连接没有释放,设计主键以及索引存在问题,hebernate很稳定的,而且性能很高的,
发表于:2007-01-27 09:53:1926楼 得分:5
查询的时候用jdbc方式,不就ok了。不必说选择hibernate,就什么都用hibernate。要根据你的需求和实际来选择。如果数据量大,关联关系多的情况,最好在查询时候用jdbc方式,这样可以提高很多的效率。在插入更新和删除的时候使用hibernate。
发表于:2007-01-27 10:46:4527楼 得分:0
真正明白的人会懂的这个道理

orm性能损耗大于native   sql

native   sql性能损耗大于存储过程。

项目小的时候看不出来

项目大的时候就很明显

sg552明显没做过大的项目,所以他不明白也很正常
发表于:2007-01-27 11:02:1028楼 得分:0
争这个挺没劲,谁的项目谁做主!
发表于:2007-01-27 11:42:2329楼 得分:0
是是。。。我没做过大的项目!!!
zqpsswh(似水无痕)   (   三级(初级))   信誉:100
说的很好:
大项目都用native   sql。    


汗。。。   很好,很强大。。。
发表于:2007-01-28 14:46:4730楼 得分:5
很多东西都是有利就有弊的,打个最简单的比方,线程安全与线程不安全,谁都知道安全的好,可是要了安全就缺少了性能,即使是做安全了,也得分程序员,不是所有的程序员都能做的很好,所以说hibernate也一样,既然选了就一定得牺牲内存,只是看程序员做的怎么样了,可能会牺牲的很少,也可能会牺牲的很多,我hibernate用的不好,不过我觉得我用jdbc写的东西还不如用hibernate写的,虽然很灵活,还有就是我认为用过hibernate的朋友以后在用jdbc应该会有很大的提高,除非你学的只是怎么用而不知道思想,我相信楼上用过hibernate的兄弟都有同感


快速检索

最新资讯
热门点击