|
锁定老贴子 主题:Hibernate的性能
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2004-07-22
xiecc 写道 3、Cache我们已经采用了。但proxy的用法我至今仍然有点迷糊。
在Hibernate的文档里似乎只要在定义文件里加这么一句就可以了: <class name="eg.Order" proxy="eg.Order"> 但实际使用时我们发现这样做之后,Hibernate取数据时的SQL语句似乎一句都没有少。 我们现在的想法是自已来实现Proxy类,它的接口与实体完全一样,在Proxy里SQL语句来实现取数据操作。不知是否可行? 上面的proxy和cache没有任何关系,只是用于lazy loading,请看hibernate中文文档第5章: [code:1]proxy (可选): 指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。[/code:1] |
|
| 返回顶楼 | |
|
最后更新时间:2004-07-22
为了在性能上得到平行,对many-to-one不直接使用关连,例如:user&ACL,取user时,不取ACL,要取ACL就先取user,再取ACL,毕竟应用取user的频率比取ACL高,没必要在取user是硬要把ACL一起取出来.
还有其他many-to-one都和这个很类似,如果many很少的话就没问题,例如:人&宠物,通常一个人只有少于等于一个宠物,这种情况取人的时候把人跟宠物一起取出对系统影响不大 |
|
| 返回顶楼 | |
|
最后更新时间:2004-07-22
hibernate本身的性能非常好,关键在设计本身
和你的数据库本身,以及你的访问量和数据库的性质 针对不同的环境一定要有不同的设计的,一套设计肯定不能适用于全部的环境 我举个典型例子来说吧 你的hibernate设计可以采用单session的方式,也可以采用多session的方式,应用环境不同,结果也大大的不同。当用户人群少,数据库记录两低的时候,多session的设计是非常有优势的,这就是为什么那么多人 反对使用threadlocal管理session的主要理由把,的却 把两种设计都放在这里,你会发现多session的性效要比 threadlocal的强太多了,并且编程也异常的容易,这种例子,我不再举了,你在这个论坛上都可以下的到。可是 当人群变多,数据库记录海量增长的时候,我们发现问题来了,我们做的应用无限制的吃去内存,应用的响应开始变慢,这是为什么呢?不知道大家是否理解究竟什么是session,其实从根本上说就是一张hashmap,这样大家就好理解了,当不同的用户,同时访问应用的时候,不同的人建立不同的连表,然后释放,而当并发人群急速增长的时候,于是问题就来了。那怎么办,threadlocal没有其他的办法,你要解决一个同步的问题,我们只有一个session,你不能够同时往里读取数据,然后又写入数据的,并发用户这么多,你只可以让他们一个一个得来!!! 哇,这样效率不是太低了,的确,我一开始就说了,小型系统,使用threadlocal绝对是低效的做法的,可是当规模上来了之后,我们再来看,内存不再无限制的开销,cpu德负荷也降下来了,唯一一点发生变化的是,用户的客户端可能多等了0.001秒钟,一个在服务段队列的时间,这就是设计。 讲了一个设计的例子,我们来看多对一,一对多,会让我们应用的效率降低么? 请注意hibernate只是帮助我们完成了mapping 的工作 原来的一对多也好或者多对一也好,本来就存在的,之所以让你觉得效率低,是因为在得到父亲后,还要去把每一个儿子给读出来,可是注意,你只是多执行了一条sql而已,为什么会慢的呢,我想问题还是在设计之上 |
|
| 返回顶楼 | |
|
最后更新时间:2006-12-22
大家有没有百万级用户的设计经验...
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-12
xiaoyu 写道 我也说上一句吧。
虽然HB是好,方便,但有关数据库设计的一些性能原则还是要考虑的。 毕竟它只是Mapping而已。 所以也要设置索引等东西。 如果服务器内存够大, 可以考虑采用 TOB, 然后你就可以用面向对象的关系模型(纯Java类代码)来设计开放了, 之后只需编译运行Java程序, 底层传统关系数据库的细节都不用考虑了. 性能也比Hibernate平均快上几倍. 只是你的内存要足够放下最大的持久对象物理拓扑图. 索引其实也是个好东西, 这是关系数据库的看家本事了, 有些数据库可以根据需要自动构造索引, 不过如果可以根据情况人工指定索引, 也不失为一种优化手段. |
|
| 返回顶楼 | |
|
最后更新时间:2006-12-13
上面有人在讲threadlocal的问题,threadlocal只是一个工具类,会对性能有什么影响吗,而且threadlocal跟同步更没有什么关系,而且hibernate性能不单单是设计问题,更多问题会出现在编码上,而不是设计,老实说因为设计使hibernate性能低下的案例很少吧,多数都是不当使用造成的,比如说一个很大的对象,关联另一个很大的对象,这些对象对应的数据库中的记录都是百万千万条的,而要显示的只不过是两个对象的几个属性,这个时候就不应该查出这两个整对象了,显然得用hql查对象的属性,再包装成对象,否则查询速度肯定低而且对内存使用肯定高,关键还是在于怎么去用hibernate
|
|
| 返回顶楼 | |
|
最后更新时间:2007-06-14
......现在作的省级系统中不敢用hibernate,想用,可是怕性能上的问题....
唉,还是老老实实写sql,写过程吧。 |
|
| 返回顶楼 | |
|
最后更新时间:2006-12-22
基本不用关联.除非数据量很小.当用到的时候再去取好了.我们team都这样做了.还没发现有傻不爽的地方
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-21
也谈谈对Threadlocal的一点看法:Threadlocal确实是像上面有人提到的那样,是一个HashMap,但是大家都知道这个HashMap不是一般的HashMap,里面的对象是和每一个具体的线程关联的.对于现在的Web应用,一般都是多线程的.所以上面的同志说的对确实和同步没多大关系.如果不用ThreadLocal方式的话,你的跨Session的请求会引起Session频繁的关闭和打开,消耗资源相当严重. 还有你的事务管理, 你的跨Session事务怎么管理? 这样的话除非你使用JTA来管理了
|
|
| 返回顶楼 | |
|
最后更新时间:2006-12-22
pioneer21th 写道 也谈谈对Threadlocal的一点看法:Threadlocal确实是像上面有人提到的那样,是一个HashMap,但是大家都知道这个HashMap不是一般的HashMap,里面的对象是和每一个具体的线程关联的.对于现在的Web应用,一般都是多线程的.所以上面的同志说的对确实和同步没多大关系.如果不用ThreadLocal方式的话,你的跨Session的请求会引起Session频繁的关闭和打开,消耗资源相当严重. 还有你的事务管理, 你的跨Session事务怎么管理? 这样的话除非你使用JTA来管理了
Threadlocal只是一个工具类,是一个把session作为交给某个线程的工具了,session引用最后存放在线程对象得一个hashmap中,我说这话是因为上面有人说什么session性效和ThreadLocal性效得比较芸芸,两个是不同的东西,能比吗?我并没有说不用ThreadLocal啊,你用hibernate+spring,那里面不就是ThreadLocal来实现session跟线程走的这个方案吗,hibernate in action中的hibernateutil类不也是这么做的吗,我想说的是上面有人误解了Threadlocal的用途和功能。象你说的不用Threadlocal的话也没有必要引起Session频繁的关闭和打开吧,session是轻量级的,他又不是sessionfactory,session应该也是放在一个pool里的。 |
|
| 返回顶楼 | |











