为什么需要一个无状态EJB池

时间:2015-06-23 20:25:25

标签: java ejb server pool

我知道:

  

对于无状态会话bean,服务器可以维护可变数量   池中的实例。   每次客户端请求这样的无状态bean(例如通过   方法)选择随机实例来服务该请求。

我的问题是:为什么需要游泳池? EJB无状态bean的一个实例是否应该足以为所有请求提供服务?

此外,如果给定无状态bean的服务器正在使用10个实例的池, 10是它可以在这样的bean上处理的最大请求数吗?

你能帮我清楚一下吗?

修改

  

ejb 3.1规范的第4.3.14节给出了答案。

     

4.3.14序列化会话Bean方法以下要求适用于无状态会话Bean和有状态会话Bean。参见第4.8.5节   单例会话bean并发要求。

     

容器序列化对每个有状态和无状态会话的调用   bean实例。大多数容器都支持a的许多实例   会话bean并发执行;但是,每个实例只能看到   方法调用的序列化序列。因此,有状态或   无状态会话bean不必编码为可重入。

     

容器必须序列化所有容器调用的回调(即   是,业务方法拦截器方法,生命周期回调   拦截器方法,超时回调方法,beforeCompletion和   所以,它必须使用客户端调用序列化这些回调   业务方法调用。

在线搜索,我的问题是线程池是必要的 对强制执行EJB无状态方法的规范 是线程安全的。 因此,如果我们在池中有10个bean,则只能同时提供10个请求,另一个将排队并分配给第一个免费bean。 如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:1)

如果你创建一个无状态会话bean,它不关心哪个客户端正在调用,它允许你在多个客户端重用这些实例,这样你就可以在你的应用程序中获得更好的性能。它是其中一个无状态会话bean和有状态会话bean之间的主要区别。

有状态会话bean将为每个客户端创建一个实例,并且它将降低应用程序的性能,因为您将同时拥有多个实例。

要拥有一个池,您可以根据应用程序的负载增加无状态ejb实例的数量:)

修改

如果您只需要一个实例来处理所有请求,那么您可以使用单例会话bean 而不是无状态会话bean 无状态会话bean是为这个不需要状态的操作而制作的,这个操作可以帮助你提高性能。

如果你有一个包含10个实例的池,你可以收到任意数量的请求,但只有10个实例可以参加它们。

答案 1 :(得分:0)

单个无状态EJB实例可以在理论上处理所有请求但速度太慢。 性能是维护无状态EJB池的主要成果。池节省了创建EJB和获取任何预定义资源以处理传入请求的时间。容器保证了线程的安全行为,因此在池中有多个就绪实例可以提高性能。

  

此外,如果ginen无状态bean的服务器使用的是10个实例的池,那么它在这样的bean上可以处理的最大请求数是10吗?

使用10个实例池可以同时处理10个同时请求。

答案 2 :(得分:-1)

无状态EJB不是无状态的。 (杜?)

我解释一下。无状态EJB具有一些状态,例如用于了解EJB是否正在运行/休眠或者是否已加载EJB等的标志。即,无状态EJB具有隐藏字段