Java中的无状态bean不会在客户端的两次调用之间保持状态。因此,简而言之,我们可能会将它们视为具有业务方法的对象。每个方法都接受参数并返回结果。调用该方法时,会在执行堆栈中创建一些局部变量。当方法返回时,本地人将从堆栈中删除,如果分配了一些临时对象,他们仍然会被垃圾收集。
从我的观点来看,与单独的线程调用相同单个实例的方法没有区别。那么为什么容器不能使用bean的一个实例而不是汇集其中的一些呢?
答案 0 :(得分:27)
汇集会做几件事。
一,通过每个实例使用一个bean,可以保证线程安全(例如,Servlet不是线程安全的)。
二,减少bean可能具有的任何潜在启动时间。虽然会话豆是“无国籍的”,但它们只需要对客户端无国籍。例如,在EJB中,您可以将多个服务器资源注入会话Bean。该状态对bean是私有的,但是没有理由不能将它从调用保持到调用。因此,通过池化bean,可以将这些查找减少到仅在创建bean时发生。
三,您可以使用bean池来节流流量。如果池中只有10个Bean,那么最多只能同时处理10个请求,其余的将排队等候。
答案 1 :(得分:1)
池化可提高性能。
处理所有请求/线程的单个实例会导致大量争用和阻塞。
由于您不知道将使用哪个实例(并且多个线程可以同时使用单个实例),因此bean必须是线程安全的。
容器可以根据实际活动管理池大小。
答案 2 :(得分:1)
Java EE模型的事务性使用线程上下文来管理事务生命周期。
这种简化的存在使得没有必要实现任何特定的接口来直接与UserTransaction对象进行交互;当从InitialContext检索事务(或注入到会话bean)时,它被绑定到线程局部变量以供重用(例如,如果无状态会话bean中的方法调用另一个也使用注入事务的无状态会话bean。 )
答案 3 :(得分:0)
Statelesss会话bean的生命周期不存在,Passive和MethodReady(被动或非活动)状态。要优化perormance,而不是遍历bean从create到method ready状态,容器管理bean在active和被动状态通过容器回调 - ejbActivate()和ejbPassivate()通过管理bean池。
sreenut
答案 4 :(得分:0)
天生的方法是线索安全(包括静电)。为什么?很简单,因为方法中的每个变量都是在堆栈内存中创建的,即方法中使用的每个变量都是按调用创建的(它不是共享的)。但是,参数不是堆栈的一部分。
但是,如果方法使用不安全的变量,则该方法不安全:
a)调用静态字段或变量。但是,它发生在每一个案例中。
b)调用它共享的资源。例如EntityManager。
c)传递一个不安全的参数。