只有人才会去浪费,你把Weblogic当Tomcat来用,究竟是你浪费的,还是Hibernate浪费的?

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

我本来是想做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在这方面有缺陷,还是没有缺陷。

cglib不会有问题,class被enhance后就缓存住了

我觉得Robin的话有道理, , hibernate的设计思路比较实用,对不同的需求有不同的解决方法, 考虑了很多和不同数据库,appserver兼容的问题. . 我以前写过自己公司的persistence框架, 看了hibernate的设计, 学习到不少架构的设计方法.
我想对于程序员或设计员来说, 本身能力的提高最重要.

在项目开发时, 开发和运行效率以及灵活性是非常重要的指标。由于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是不是有一定的关系? 正在看。

帖子没有技术含量我见过不少..但是像这样牛皮轰轰地露怯我还真是...

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

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

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

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

-..- 继续潜水..

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

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


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

请问各位,如何在ejb中使用hibernate?
是和tomcat一样简单配置一下呢?还是必须要修改
ejb server?
如果要修改server的话,请问目前hibernate可以工作于
哪几种app server呢?

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

>>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。

To:muziq

我也没有什么测试程序。但是压力测试不需要那么复杂的测试程序,写几个简单的表就可以了。你可以分两步来测:

第一步:直接写Java程序使用Hibernate连接Oracle数据库,测试大容易数据的插入,更新操作,观察是否会造成数据库出错,比如一次插入10万条记录这样来看看。然后比较同样数据量的JDBC程序。测试的时候就是JVM的参数要开的大一点,避免内存溢出错误。

第二步:测试密集访问请求。测试使用Hibernate的Servlet/JSP的处理请求速度。这个测试很难进行,因为并发数量一大,瓶颈在数据库连接池的同步上,会造成单个JSP执行速度越慢,整体测试速度越快的现象。只能让每个JSP的Hibernate逻辑尽量复杂,查询的记录数尽量多一些,拖慢JSP执行速度。我自己是用Apache BenchMark软件来测试,你随便采用什么压力测试软件,总之就是不断往上加压,看看并发访问到多少的时候,连接池会崩溃掉,然后比较JDBC程序什么情况下让连接池崩溃掉。这个测试需要对数据库和连接池进行一些调整,把Oracle的大型池开的大一些,连接池的初始化和最大化连接池数量开大。

看看测试过程中,Hibernate运行是否稳定,是否很容易造成连接池崩溃和数据库出错。

To: yung

如果只是在单个EJB里面使用Hibernate,可以把EJB和Hibernate打包在一起成EAR发布到App Server上,这样就行了。

如果在整个应用内使用Hibernate,你可以把Hibernate放到App Server的CLASSPATH里面,自己写一个Singleton模式的SessionFactory,这样就行了。

Singleton在某些特殊的情况下可能会失效,所以你也可以把Hibernate配置到App Server的JNDI上,这需要在App Server刚启动的时候就运行Hibernate的初始化代码,详细的请见:http://www.jdon.com/jive/article.jsp?forum=16&thread=9188

>> 请问各位,如何在ejb中使用hibernate?是和tomcat一样简单配置一下呢?还是必须要修改ejb server?如果要修改server的话,请问目前hibernate可以工作于哪几种app server呢?<<

你这话问的很奇怪,你就好像在问,JDBC可以运行在哪几种App Server上一样!Hibernate只存在和数据库、JDBC驱动的兼容性问题,不存在和App Server的兼容性。可以运行在所有的App Server上。

在非集群环境下,只需要写一个Singleton模式的SessionFactory就行了,把它配置到App Server的CLASSPATH下面去,这样在EJB,在Servlet/JSP都可以使用了。

在集群环境下,例如在单台机器上启动两个Weblogic Server实例,那么用JNDI可以保证Hibernate只初始化一次,如果用Singleton模式,问题也不大,无非就是Hibernate会初始化两次而已。

前才把hibernate的文档看完,也把hibernate自带的test做了。
我感觉把hibernate不仅仅是对jdbc的封装,它还包含很多oo的设计思想。

不知道大家对Hibernate 和 jdo2.0 有什么看法?

看大家都比较有时间来研究新的技术,真是羡慕!