关于instance pool的疑问

04-09-12 jamesdusun
如果比较entity bean和stateful session bean的状态图,就会发现stateful session bean没有pooled状态。为什么会这样?

先说一下我对stateful session bean的理解:当stateful session bean被passivate时,他的状态会被串行化到二级存储器中,而bean实例会从内存中被消除。当这个passivated bean需要被重新激活时,重新构造bean实例,然后反串行化bean的状态。不知道我的理解是否正确?

我的疑问是:为什么不将被passivate的stateful session bean实例(我这里说的只是bean实例,其状态仍然被串行化到二级存储器中)放到一个pool中,如entity bean一样,这用也可以用少数的bean实例服务于多个EJBObject.

希望能有高手解惑
多谢了

banq
2004-09-13 16:49
stateful session bean正如它的名字一样,是有状态,所谓有状态就是有数据,这些数据是某个客户端私有的,所以必须使用Cache支持。

我一直努力让初学者理解Cache和Pool的区别,一旦掌握,Session Bean等就容易理解,我的书籍《Java实用系统开发指南》中第5章,就是从Cache和Pool介绍EJB,而不是象其他书籍从RMI和Corba这样网络玄妙概念开始的。

jamesdusun
2004-09-15 18:16
多谢答复,

但我的问题好像并没有被解释,我还是不太明白,能再往深里解释一下么,谢谢了。

yanbuhan
2004-09-15 19:31
其实banq先生已经说的很清楚了。
Cache的为某一用户专用。
Pool的为所有用户共用。
有状态EJB,它与某一特定用户绑定,所以只能用Cache
而实体EJB呢,为所有用户共同使用,所以可以用Pool.

不知道说的对不对。

banq
2004-09-16 09:26
是的,无态Session Bean是Pool,有态Session Bean是Cache,而实体bean则是Pool + Cache。

Pool想像成一个容器、池,而Cache则是一个堆栈或列表。这设计EJB原理,具体解释起来会很长。但是理解这个对使用EJB很重要。

jamesdusun
2004-09-17 15:01
首先谢谢二位

说一下我对stateful session bean的理解:当stateful session bean被passivate时,他的状态会被串行化到二级存储器,也就是硬盘中,而bean实例会从内存中被消除。当这个passivated bean需要被重新激活时,重新构造bean实例,然后反串行化bean的状态。不知道我的理解是否正确?

你们的意思是不是当stateful session bean被passivate时,他的状态会被串行化到cache而不是硬盘中?如果是这样的话,我觉得就违背了passivate本来的意义,我理解passivate的意义就是为了减少过多的内存消耗,当容器发现内存占用过大的时候,暂时将处于非活动状态的bean放到硬盘上,等需要这个bean服务的时候再取到内存中。如果串行化到cache中就不要做passivate好了,就以bean实例的形式放在内存中不是更省事?

jacobzheng
2004-09-27 17:18
其实不矛盾,对于statefulSB来说,他是放在cache内部的,因为cache是可以保持状态的,所以statefulSB有状态,所以可以用passivate and active 方法从把对象在内存和硬盘之间相互置换。然而 statelessSB它的对象放置在pool里面的,因为pool是共享的,所以在statelessSB运用
passivate and active 是没有必要的。