为什么池无状态会话bean?

Java中的无状态bean不会在客户端的两次调用之间保持状态。 因此,简而言之,我们可能会将它们视为具有业务方法的对象。 每个方法都接受参数并返回结果。 调用该方法时,会在执行堆栈中创建一些局部变量。 当方法返回时,将从堆栈中删除本地,如果分配了一些临时对象,则无论如何都会对它们进行垃圾回收。

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

合并做了几件事。

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

二,减少bean可能具有的任何潜在启动时间。 会话豆是“无国籍”,他们只需要对客户端无国籍。 例如,在EJB中,您可以将多个服务器资源注入会话Bean。 该状态对bean是私有的,但是没有理由不能将它从调用保持到调用。 因此,通过池化bean,可以将这些查找减少到仅在创建bean时发生。

三,您可以使用bean池作为节流量的手段。 如果池中只有10个Bean,那么最多只能同时处理10个请求,其余的将排队等候。

池化增强了性能。

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

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

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

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

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

Statelesss会话bean的生命周期不存在,Passive和MethodReady(被动或非活动)状态。要优化perormance,而不是遍历bean从创建到方法就绪状态,容器通过以下方式管理bean在主动和被动状态之间容器回调 – ejbActivate()和ejbPassivate()通过管理bean池来实现。

sreenut

本质上的方法是线索安全(包括静态)。 为什么? 很简单,因为方法中的每个变量都是在堆栈内存中创建的,即方法中使用的每个变量都是在每次调用时创建的(它不是共享的)。 但是,参数不是堆栈的一部分。

但是,如果方法使用不安全的变量,则该方法不安全:

a)调用静态字段或变量。 但是,它发生在每一个案例中。

b)调用它共享的资源。 比如EntityManager。

c)传递一个不安全的参数。