robbin
2003-09-05 16:53
如果你对Hibernate持有异议,如果你觉得Hibernate有缺陷,那么拜托你的帖子有点深度好不好?我也很想知道Hibernate有哪些缺陷,曾经以为的很多缺点都随着对Hibernate的功能的进一步了解而解除了。目前我对Hibernate确实有一个还没有搞清楚的问题,我不知道这是不是Hibernate的缺陷,但因为没有足够的测试环境,所以还不能确定,因此不敢乱说。

但对于那些连Hibernate都没有怎么用过,对J2EE整个软件架构设计都不甚了了,甚至对App Server都缺乏正确的认识的情况下,胡乱发表批评意见,我对这种夸夸其谈的肤浅的态度感到愤怒。

windman
2003-09-05 17:10
Robbin,说那么多名词,懒人们不懂,简单点说吧Hibernate就是JDBC,能用到JDBC的地方就能用它,用JDBC就会封装数据库操作,Hibernate就是个最好的封装框架,省得自己花功夫了

evan
2003-09-05 17:43
>>但是,凡是大的项目,商业的项目,都不可能用Tomcat。那就用Weblogic ,WebSphere ,iplanet 。十来万的application Server,由于Hibernate搞掂了一切而成为摆设,你只是用它作为Servelet引擎,数据库连接池,其实是当Tomcat用了岂不可悲?我想这也是缺点。

>这说明你根本不了解什么叫做App Server,你只把App Server === Servelet Container + 数据库连接池 + EJB Container。简直可笑!

原来AppServer还有很多很多功能。。那不是浪费的更多?

muziq
2003-09-05 17:49
>目前我对Hibernate确实有一个还没有搞清楚的问题,我不

>知道这是不是Hibernate的缺陷,但因为没有足够的测试环

>境,所以还不能确定,因此不敢乱说。

说出来也无妨啊!我看能不能帮你测试。

robbin
2003-09-05 18:10
上面回贴情绪有点激动,希望谅解,我不是因为有人批评Hibernate而感到不快,而是因为帖子里面的观点实在让我觉得荒谬。不管觉得Hibernate好也吧,不好也吧,我唯一觉得遗憾的是,在中文论坛里面找不到一个对Hibernate的真正高水平的评价。在TSS上有一个关于Hibernate的hot thread,跟了几百贴,其中包括Hibernate作者Gavin和LiDO JDO的CTO,对于JDO和Hibernate有过一些激烈的争论,我曾经耐心的看了一遍,仍然没有发现针对Hibernate真正有力的攻击,那些所谓的攻击无非针对Hibernate没有一个GUI的配置工具,没有商业公司支持,没有标准化等等这些站不住脚的理由。

补充几点我的意见:

一、Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系。Hibernate可以用在任何JDBC可以使用的场合,例如Java应用程序的数据库访问代码,DAO接口的实现类,甚至可以是BMP里面的访问数据库的代码。从这个意义上来说,Hibernate和EB不是一个范畴的东西,也不存在非此即彼的关系。

二、Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。

三、Hibernate不能用来直接和Entity Bean做对比,只有放在整个J2EE项目的框架中才能比较。并且即使是放在软件整体框架中来看,Hibernate也是做为JDBC的替代者出现的,而不是Entity Bean的替代者出现的,让我再列一次我已经列n次的框架结构:

传统的架构

1) Session Bean <-> Entity Bean <-> DB

为了解决性能障碍的替代架构:

2) Session Bean <-> DAO <-> JDBC <-> DB

使用Hibernate来提高上面架构的开发效率的架构:

3) Session Bean <-> DAO <-> Hibernate <-> DB

就上面3个架构来分析:

1、内存消耗:采用JDBC的架构2无疑是最省内存的,Hibernate的架构3次之,EB的架构1最差。

2、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通JDBC,运用Batch语句,调整PreapredStatement的Batch Size和Fetch Size等参数,以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。EB的架构效率会差的很远。

3、开发效率:在有JBuilder的支持下以及简单的项目,EB架构开发效率最高,JDBC次之,Hibernate最差。但是在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率高的惊人,JDBC次之,而EB架构很可能会失败。

4、分布式,安全检查,集群,负载均衡的支持

由于有SB做为Facade,3个架构没有区别。

四、EB和Hibernate学习难度在哪里?

EB的难度在哪里?不在复杂的XML配置文件上,而在于EB运用稍微不慎,就有严重的性能障碍。所以难在你需要学习很多EJB设计模式来避开性能问题,需要学习App Server和EB的配置来优化EB的运行效率。做EB的开发工作,程序员的大部分精力都被放到了EB的性能问题上了,反而没有更多的精力关注本身就主要投入精力去考虑的对象持久层的设计上来。

Hibernate难在哪里?不在Hibernate本身的复杂,实际上Hibernate非常的简单,难在Hibernate太灵活了。

当你用EB来实现持久层的时候,你会发现EB实在是太笨拙了,笨拙到你根本没有什么可以选择的余地,所以你根本就不用花费精力去设计方案,去平衡方案的好坏,去费脑筋考虑选择哪个方案,因为只有唯一的方案摆在你面前,你只能这么做,没得选择。

Hibernate相反,它太灵活了,相同的问题,你至少可以设计出十几种方案来解决,所以特别的犯难,究竟用这个,还是用那个呢?这些方案之间到底有什么区别呢?他们的运行原理有什么不同?运行效率哪个比较好?光是主键生成,就有七八种方案供你选择,你为难不为难?集合属性可以用Set,可以用List,还可以用Bag,到底哪个效率高,你为难不为难?查询可以用iterator,可以用list,哪个好,有什么区别?你为难不为难?复合主键你可以直接在hbm里面配置,也可以自定义CustomerType,哪种比较好些?你为难不为难?对于一个表,你可以选择单一映射一个对象,也可以映射成父子对象,还可以映射成两个1:1的对象,在什么情况下用哪种方案比较好,你为难不为难?

这个列表可以一直开列下去,直到你不想再看下去为止。当你面前摆着无数的眼花缭乱的方案的时候,你会觉得幸福呢?还是悲哀呢?如果你是一个负责的程序员,那么你一定会仔细研究每种方案的区别,每种方案的效率,每种方案的适用场合,你会觉得你已经陷入进去拔不出来了。如果是用EB,你第一秒种就已经做出了决定,根本没得选择,比如说集合属性,你只能用Collection,如果是Hibernate,你会在Bag,List和Set之间来回犹豫不决,甚至搞不清楚的话,程序都没有办法写。

robbin
2003-09-05 18:26
只有人才会去浪费,你把Weblogic当Tomcat来用,究竟是你浪费的,还是Hibernate浪费的?

Hibernate只不过取代了JDBC代码而已,难道Hibernate会毁了你的Session Bean了?Hibernate会毁了你的JMS了,Hibernate会毁了你的集群,负载均衡了?

robbin
2003-09-05 18:43
我本来是想做Hibernate的压力测试,看一下在重负载、密集访问请求的情况下,Hibernate的稳定性如何?

Hibernate本身封装的非常轻量级,所以理论上来说Hibernate的稳定性应该非常接近JDBC驱动的稳定性。但是这里面有一个变数,就是Hibernate采用cglib库来动态生成PO的字节码,这个cglib是我所不熟悉的,而在重负载,大容量的情况下,JVM内存里面会有非常频繁的PO字节码生成的过程,我不知道该过程是否会对Hibernate的稳定性造成一定的影响。

前面我提到过用Hibernate对SAPDB一次插入10万条记录导致SAPDB挂掉的故障,如果用JDBC,插入10万条不会挂掉,会在插入20万条的时候挂掉,这还可以是数据库的问题。

另有一次,我在Weblogic7.0上,用Weblogic的连接池连接Oracle8i做大容量,密集请求的访问测试,用10个并发,1000次请求,每次查询1万条去测试,结果发现Hibernate到是很稳定,但是连接池挂掉了。但同样的数据量,用JDBC却没有问题。当然上到更高的负载,JDBC迟早也会把连接池挂掉,但是好像表现出来的是Hibernate对数据库的“破坏能力”比JDBC要强一些,我搞不清楚这究竟是怎么回事,按道理来说,Hibernate和JDBC不应该表现出不同的结果来,不过我的机器配置也比较低,也有可能是硬件配置造成的。

这需要一个很好的环境来做测试,找出原因。至少需要一个硬件很好的机器安装像Oracle这样的中负载数据库。另一台机器也要很好的配置运行测试程序,避免硬件问题。JDBC驱动本身也要很稳定,然后分别直接连接数据库,和在App Server上面运行测试,找出JDBC和Hibernate挂掉连接池和数据库的临界值,记录JVM内存使用和CPU占用,分析出原因,究竟是因为Hibernate在这方面有缺陷,还是没有缺陷。

guty
2003-09-05 18:49
cglib不会有问题,class被enhance后就缓存住了

yyanghhong
2003-09-05 22:59
我觉得Robin的话有道理, , hibernate的设计思路比较实用,对不同的需求有不同的解决方法, 考虑了很多和不同数据库,appserver兼容的问题. . 我以前写过自己公司的persistence框架, 看了hibernate的设计, 学习到不少架构的设计方法.

我想对于程序员或设计员来说, 本身能力的提高最重要.

bruce
2003-09-05 23:02
在项目开发时, 开发和运行效率以及灵活性是非常重要的指标。由于Entity Bean天生是一种粗粒度的使用方式,这就必定使它在装载的时候有较长的响应时间,也不能自如的支持懒装入的方式,使用成细粒度会使程序变得复杂,以及远程调用细粒度的entity bean是一种非常可怕的行为。

Hibernate正好满足开发和运行效率以及灵活性,说来说去,它可以称做一个OO化的JDBC, 这样大家就不会对Hibernate产生误解及恐惧心理。它支持粗细两种粒度方式,运用起来灵活自如,前提是你必知道如何使用,一个entity bean 实现要N种重复的方法, such as ejbRemove,ejbstore,ejb...., 光类也有一大堆,象Home Interface, Romote Interface..., Primary class if necessary. Hibernate只需要一个就行了。

另To guty and robbin,

cglib 跟 Dynamic proxy是不是有一定的关系? 正在看。

tiyi
2003-09-05 23:40
帖子没有技术含量我见过不少..但是像这样牛皮轰轰地露怯我还真是...

如果你觉得hibernate不好,提出意见来.居然说出hibernate只跑tomcat的理论来....现在没含量就乱发言的人..

看来普及知识任重道远啊...

(对自己上面的无技术含量+灌水帖表示遗憾..)

更希望看到robbin做进一步的探讨,不要和他们纠缠于这些心理排斥,毫无真正意义的争论.

-..- 继续潜水..

robbin
2003-09-06 02:23
我不是一昧的挺Hibernate,排斥Entity Bean。Hibernate代表了一类轻量级的ORM技术,和Hibernate相类似的还有OJB,Castor等等很多软件。在J2EE的架构当中,我个人认为以DAO + ORM来替代 CMP 和 DAO + JDBC是一个兼顾开发效率和运行效率的最佳方案,并且摆脱了Entity Bean的笨拙的控制,你可以真正不受限制的设计对象持久化层。

BTW,我最近才碰巧知道,也有BEA的客户开始要求在Weblogic上用Hibernate取代Entity Bean了。

muziq
2003-09-06 08:18
Robin:

我可以帮你做测试!我的Team正在搭建一个压力测试的环境,客户机数量充足(约8台可用),均为1G内存,赛扬2.2G,一台Oracle服务器2G内存,P4-2G,一台WebLogic服务器也配4G内存,P4-2G,计划用LoadRunner 7.51或Grinder做测试。最好你把要测试的程序以及测试脚本发给我,这样我可以直接运行。我对Hibernate刚入门,对自己写的测试不太自信,见笑!

anonymous
2003-09-06 10:19
请问各位,如何在ejb中使用hibernate?

是和tomcat一样简单配置一下呢?还是必须要修改

ejb server?

如果要修改server的话,请问目前hibernate可以工作于

哪几种app server呢?

感觉这些问题很棘手, pls...

guty
2003-09-06 11:15
>>cglib 跟 Dynamic proxy是不是有一定的关系? 正在看

是有关系,Dynamic proxy是一种设计模式,Banq好像介绍过,cglib、Jdk1.3+都有实现,但两者的实现方式不同。

jdk是用的code generation的方式,产生新类并编译、载入,例如,对于接口集合[Intf1,Intf2,...,Intfn],可以生成class DynaImpl,实现

所有接口。也许是由于class的方法可能不是public的,jdk不能直接根据class生成proxy。

cglib是用bytecode engineering的方式,在原类的bytecode上直接修改,产生新类并编译、载入,这样不仅可以实现jdk能够实现的功能,而且可以直接用来增强类,例如对于类c,接口集合[Intf1,Intf2,...,Intfn],可以修改c生成c$$$1,继承c,并实现所有接口。

Hibernate曾经使用jdk来实现dynamic proxy,但要求entity类必须实现接口,比较麻烦,所以后来改用cglib。

猜你喜欢
10Go 上一页 1 2 3 4 ... 10 下一页