我知道:
对于无状态会话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。 如果我错了,请纠正我。
答案 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具有隐藏字段。