论坛首页 Java企业应用论坛

为何每次问到传统sql如何调优就没人回答?另附几则hibernate性能优化实践

浏览 59398 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-03-24  
Hibernate 因为是 ORM .在很多时候还是不能完全实现原生SQL的效率.

如果项目时间紧,这个时候就要最求的是快速开发.那么选择Hibernate.当然执行效率上就有点欠缺了.

我们项目:两台服务器,日PV过千万.采用的是原生SQL,和缓存技术.如果使用Hibernate,我估计是难以承受的.
0 请登录后投票
   发表时间:2010-03-24   最后修改:2010-03-24
downpour 写道
抛出异常的爱 写道
linliangyi2007 写道
抛出异常的爱 写道
最建议用的人往往对hibernate只是作过demo没有实践


这个评论有失“异常哥”的光辉形象啊

我咬着后槽牙说。。。
某个表100多个字段。。。。
恶心的我把它们分成N个小实体类
一个大类下还有一个包专门放它的组成类的包。
。。。。。。。。。。。
还好当时没有用openInview
不然我都不知道怎么死的。
PS:EJB项目的二期。


这就是你的实践?字段多和OpenSessionInView有啥关系?



下一个项目的同志门就把opensessioninview 研究明白上了。
之后有人把set 查出来在页面上过滤set找到对应的实体用来显示。。。。。。。
这辈子没见过那么精彩的数组变幻了

PS:想当年我是救火队的,
为了能看的懂,自己摸着改代码,
实在是在一个页面中上百个不同的属性
有相似的不相似的。
你说我E文差我也认了。
没法子想要改就得看的懂。
0 请登录后投票
   发表时间:2010-03-24  
gdpglc 写道
anky_end 写道
很多做大系统的公司,例如电信,电力,卖油的,其系统历史悠久。

应该说对关系数据库操作的经验是自始至终贯彻下来,积累下来。对系统设计也是以数据库模型为中心而不是对象为中心。这是个设计思路上的根本不同。

另外就是系统风险,应该说,要用好hibernate,是有系统风险的。

罗宾当初有写过帖子,证明hibernate事实上没有性能问题,他也是有实例支撑,javaeye早期就是hibernate做持久层。但是很多电信、电力系统转向hibernate的过程中,能优化到javaeye层次的很少。很多系统仅仅一个登陆过程就比从前jdbc时代慢上许多。

说一千道一万,不熟悉不精通hibernate的还占大多数。

类似jdbc、ibatis这样的sql操作框架易过渡性还是很有吸引力的。


我想问一下,登陆过程会慢多少?是用测试工具测的吗?

这是个用户体验的过程,需要用测试工具测试么?

用户告诉你,我登陆比以前慢了,你能说,请你拿工具证明一下?

我并不是说hibernate就会慢了,就如linliangyi2007 说的,你可以认为是人的问题,不是工具的问题。

不过人就是这些人,工具却可以根据人的需要进行使用,就是这样。
0 请登录后投票
   发表时间:2010-03-24  
大概挺hibernate的朋友们,没理解我的意思。
我承认,也有些hibernate高手会告诉我们,用好hibernate,性能绝对不差于jdbc;也实实在在有证据支持他们的说法。

但是从大多程序员开发的系统使用情况来说,都停留在粗浅的自动化生成外加一点hql和hibernate的对象查询的使用。这种情况下,初学者有些是着眼于hibernate易于使用,还没到调优这个层次。

等到了用户抱怨为什么速度慢?这时候五花八门的手段上马,这时候发现有许多陷阱没了解清楚。

我不是在反对hibernate,而是说,因人而异因地制宜。一个项目组有哪些人有没有精通hibernate,请注意,是精通,是使用好hibernate的关键所在。

0 请登录后投票
   发表时间:2010-03-24  
linliangyi2007 写道
你也说了是Oracle的ERP,人家卖数据库的,最好你啥都用oracle,用存储过程,用oracle pro c,这样才有经济利益啊。

Hiberante自诞生那天开始就不是为了应付这种极端情况的,OK。

好吧,SAP的ERP请加个也字,他家不算卖DB出身了吧。
按照当时的实现来说,系统要充分的可配置,而且还要不停机的可调整配置,用DB为中心确实有它有利的一面。
全可配置在很多小地方很恶的,比如每张配置表基本都有两个,其中一个专门存不同语言的文字部分。连接表加倍。

插句无关的,oracle ERP还真不是用pro c,他奶奶个熊的,oracle forms/reports里面得用(类)pl sql才行。
0 请登录后投票
   发表时间:2010-03-24  
小项目小访问量的,大概简单的按照demo方式使用hibernate也没关系。

模型什么也都可以按照最合适hibernate发挥作用的方式设计。

我见过一个系统,为了减少n+1查询,干脆把所有的属性中文也一并写在主表里面。
0 请登录后投票
   发表时间:2010-03-24  
都继续抱怨吧

边抱怨边使用
0 请登录后投票
   发表时间:2010-03-24  
anky_end 写道
这是个用户体验的过程,需要用测试工具测试么?

用户告诉你,我登陆比以前慢了,你能说,请你拿工具证明一下?

我并不是说hibernate就会慢了,就如linliangyi2007 说的,你可以认为是人的问题,不是工具的问题。

不过人就是这些人,工具却可以根据人的需要进行使用,就是这样。

我想前面的兄弟也不是怀疑你说的话,是想问问差异的程度吧。
而且用户投诉了登录速度慢,自己先搞个定量验证不是很正常么。
0 请登录后投票
   发表时间:2010-03-24  
抛出异常的爱 写道
下一个项目的同志门就把opensessioninview 研究明白上了。
之后有人把set 查出来在页面上过滤set找到对应的实体用来显示。。。。。。。
这辈子没见过那么精彩的数组变幻了

PS:想当年我是救火队的,
为了能看的懂,自己摸着改代码,
实在是在一个页面中上百个不同的属性
有相似的不相似的。
你说我E文差我也认了。
没法子想要改就得看的懂。

求数组变换,长个见识。

老抛的这个项目是不是为了性能以数据库设计为核心,映射写得很憋屈,只能硬顶着处理。
这种情况确实郁闷。
0 请登录后投票
   发表时间:2010-03-24  
gdpglc 写道
夜是天堂 写道
看上去楼主应该没做过什么高并发的系统。

对一个高并发系统来说,数据库往往是整个系统的瓶颈。可以说每一条SQL语句都是优化的对象。
实际操作中,开发人员会拿着可能用到的SQL语句与DBA进行充分沟通。从这一点就可以解释,为什么说Hibernate对DBA不友好(你总不能拿着映射关系去找DBA吧)。

另外一点,Hibernate动不动就做join,对高并发系统来说这是一件很奢侈的事情。往往采取数据冗余的方式。

至于数据库迁移,楼主做的项目应该不少,碰到过多少这样的案例?

当然,Hibernate是一个非常好的东西,对一般项目来说确实能省很多工作量,对高并发系统来说也不是完全不能用,用Hibernate来做简单对象的增、删、改是没有任何问题的。


1.。可以说每一条SQL语句都是优化的对象。
象这样的sql有什么可以优化的:
select c.no, c.name from m_customers;

2 join不好吗?
你的意思,不用join,用多次查询数据库的办法获得数据?



1.。可以说每一条SQL语句都是优化的对象。
象这样的sql有什么可以优化的:
select c.no, c.name from m_customers;

****a. 上亿的注册用户,考虑是否需要分页,是否需要按国家,按号码区间查询,必须用hints严格指定索引,不许order by, 按照每个字段排序都作成索引

2 join不好吗?
你的意思,不用join,用多次查询数据库的办法获得数据?

****3千万数据的table join 2亿数据的table, 你试试。(现实项目的数据库)
根据具体情况,解决方法有很多。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics