对EJB的一点迷惑
最近一直在看EJB方面的东西,可是有一点我非常困惑
从传统的角度来讲,Entity Bean不是很适合做细粒度的对象,因为如果存在大量细粒度的对象,服务器就会花费大量的资源来维护这些Entity Beans,并且客户端同EJB之间以及EJB与EJB之间需要交互,也是一个浪费资源的操作.
在EJB 2.0标准以后,通过local接口,对象间的沟通代价减少了(我看petstore中采用了很多local接口Entity Bean的例子),可是EJB容器还需要维护这些EJBs的状态,这个代价到底有多大,EJB容器能够支持多少EJB实例,我一直不是非常清楚.
当客户端调用Session Beans时,容器生成一个Session Bean的实例,当客户端断开后,容器销毁这个实例.
可是对于Entity Bean来讲,他的存活周期很长.可是他到底什么时候销毁、什么时候钝化呢。例如,假如我用Session Bean表示订单处理,用local接口的Entity Bean来表示网上商品定购的明细条目(Item),在客户下完订单,商家确认发货以后,这些明细条目基本上就用不到了,他在EJB容器中是钝化呢(如果是钝化,Entity Bean多了,例如成千上万,代价岂不是很大),还是在合适的时候由容器销毁呢(如果是销毁,这个周期有多长呢,假如周期很长而且很多客户在定购商品,服务器是否承受的了,在IBM一个人写的J2EE Pitfalls and Best Pratics文章中有段话:“Kyle Brown 谈到一个案例(1) :用户设定系统中的每一个对象是一个 entity bean超过 200 个entity EJB’s,在服务器启动的时候要花费好几个小时,
他建议用户用session bean,返回简单的 Java 对象减少到 20 多个entity beans服务器启动时间不超过一分钟”,这里的数字指的是种类还是实例呢,如果是实例,也太...);总体来讲,我就是对EJB的维护代价和生命周期不是非常清楚。
听说Hiberate已经加入了Jboss,并准备在4.0以后取代CMP的对象持久化方式,可是我觉得CMP既然推出了这么久,总该有它的独到之处吧。
欢迎大家讨论和指导