对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既然推出了这么久,总该有它的独到之处吧。
欢迎大家讨论和指导

我的理解是:

容器会对实体BEAN缓存,但容器不知道什么样的实体BEAN,才能具有最好的缓存效果。因此在设计的时候需要仔细考虑实体BEAN的粒度。决定什么样的数据才是最需要容器缓存的。至于缓存中淘汰,更新的策略取决于容器的算法。这也是容器效率的关键。

我赞同httjack的观点,EB相当于Cache+Pool的机制,SFSB是Cache机制,SLSB是Pool机制,EJB的生命周期是依赖这些机制的。

"EJB容器能够支持多少EJB实例"?
取决于服务器内存。

其实EJB在性能上都是可以通过增大内存解决的。
当然,在内存有限情况下,就要考虑"什么样的数据才是最需要容器缓存的"

多谢你们的回答。
我想请教的是就大家的工作经验而言,在各种情况下如何考虑实体Bean的粒度,以及常见应用服务器能够承受的EJB的种类和数量的大致范围。
多谢!

实体Bean粒度粗细是依据Model设计,我是尽量细化,查询则不是通过实体Bean实现,这样可能会降低内存的征用。

 多谢
 目前我想采用Session Bean+local Entity Beans的方式来构建系统.在数据较多时用DAO获取数据列表,显示数据.如果需要编辑再根据显示的数据用Entity Bean去操作数据.
 不知道有没有什么问题?