2008-09-25 74 views
26

Java中的无状态bean不保持来自客户端的两个调用之间的状态。所以简而言之,我们可以将它们视为具有商业方法的对象。每种方法都带参数并返回结果。当调用方法时,一些局部变量正在执行堆栈中创建。当方法返回时,从堆栈中删除本地数据,并且如果分配了一些临时对象,则无论如何都会收集垃圾。为什么要使用无状态会话bean?

从我的角度来看,与单独线程调用同一单实例的方法没有区别。那么,为什么一个容器不能使用一个bean的实例而不是将其中的一些实例化呢?

回答

27

联合做几件事情。

一,通过每个实例有一个bean,保证线程安全(例如,Servlet不是线程安全的)。

二,您减少了bean可能具有的任何潜在启动时间。虽然会话Bean是“无状态的”,但对于客户而言,它们只需要是无状态的。例如,在EJB中,可以将多个服务器资源注入到会话Bean中。该状态对于bean来说是私有的,但没有理由不能从调用调用。因此,通过合并bean,可以减少这些查找,只有在创建bean时才会发生。

三,您可以使用bean池作为限制流量的手段。如果您在池中只有10个豆子,您最多只能同时获得10个请求,其余的将会排队等候。

+3

“一,通过每个实例拥有一个bean,确保线程安全(例如,Servlet不是线程安全的)。” 在无状态会话bean中如何保证线程安全? – anjanb 2008-09-25 18:37:04

0

Statelesss会话Bean的生命周期不存在,Passive和MethodReady(被动或非活动)状态。为了优化性能,不是将bean从create创建到方法就绪状态,而是遍历Bean和被动状态通过容器回调 - ejbActivate()和ejbPassivate()通过管理bean池。

sreenut

1

池化增强了性能。

处理所有请求/线程的单个实例会导致很多争用和阻塞。

由于您不知道将使用哪个实例(并且多个线程可以同时使用一个实例),因此这些bean必须是线程安全的。

容器可以根据实际活动管理池大小。

1

Java EE模型的事务性使用线程上下文来管理事务生命周期。

这种简化的存在使得没有必要实现任何特定的接口来直接与UserTransaction对象进行交互;当从InitialContext(或注入到会话bean)中检索事务时,它将绑定到线程局部变量以供重用(例如,如果无状态会话Bean中的方法调用另一个也使用注入事务的无状态会话Bean。 )