Java 为什么需要无状态EJB池

Java 为什么需要无状态EJB池,java,ejb,server,pool,Java,Ejb,Server,Pool,我知道: 对于无状态会话bean,服务器可以维护一个可变的数量 池中的实例数。 每次客户端请求这样一个无状态bean时(例如,通过 方法)选择一个随机实例来服务该请求 我的问题是:为什么需要一个游泳池? EJB无状态bean的一个实例不足以服务所有请求吗 另外,如果给定无状态bean的服务器使用10个实例的池, 10是它在这样一个bean上可以处理的最大请求数吗 你能帮我澄清我的疑问吗 编辑: EJB3.1规范的第4.3.14节给出了答案 序列化会话Bean方法以下要求适用于无状态和有状态会话B

我知道:

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

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

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

你能帮我澄清我的疑问吗

编辑:

EJB3.1规范的第4.3.14节给出了答案

序列化会话Bean方法以下要求适用于无状态和有状态会话Bean。有关详细信息,请参见第4.8.5节 单例会话bean并发性要求

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

容器必须序列化所有容器调用的回调(即 是,业务方法拦截器方法,生命周期回调 拦截器方法、超时回调方法、完成前和 依此类推),它必须用调用的客户机序列化这些回调 业务方法调用

在网上搜索一下,我的问题是需要一个线程池 对于强制使用EJB无状态方法的规范 是线程安全的。 因此,如果池中有10个bean,那么只能同时处理10个请求,另一个将排队并分配给第一个空闲bean。
如果我错了,请纠正我。

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

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


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

如果创建无状态会话bean,它不关心调用哪个客户端,它允许您跨多个客户端重用实例,这样您的应用程序将有更好的性能,这是无状态会话bean和有状态会话bean之间的主要区别之一

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

要使池允许您根据应用程序的负载增加无状态ejb实例访问的数量:)

编辑

如果您只希望所有请求都有一个实例,而这正是您所需要的,那么您可以使用单例会话bean而不是无状态会话bean,无状态会话bean是为这个不需要状态的操作创建的,这个操作将帮助您提高性能


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

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


我解释。无状态EJB有一些状态,比如一个标志,表示知道EJB是否正在运行/睡眠,或者EJB是否已加载,等等。也就是说,无状态EJB有隐藏字段

看看这些链接:我已经阅读了参考资料,但仍然没有找到令人满意的答案……我在EJB容器中发现“必须确保一个线程同时执行实例”,但是“可以将来自多个事务的请求交错到同一个实例”-这两个请求是相互矛盾的,因为通常单独的事务=单独的线程。我认为引入池是为了实现fist,而在
@PreConstruct
上节省时间是一个免费的甜蜜补充。他问道”EJB无状态bean的一个实例不应该足以服务所有请求吗?”。您解释了对象池的用途,但没有解释为什么单个EJB可以/不能服务所有请求“单个无状态EJB实例理论上可以处理所有请求,但速度太慢。“为什么这么慢?单个实例将在不同的线程上运行。假设100个线程正在为单例对象运行。另一方面,10个无状态对象使用相同的线程数处理相同的通信量。那么性能是否会相同?如果您有一个包含10个实例的池,您可以接收任意数量的请求,但只有10个实例将参与它们。因此,这意味着只能同时处理10个请求。@GionJh正如编辑所说,当达到硬上限时,无状态会话bean实例池通常不会像JDBC连接池那样阻止请求。这取决于执行情况;例如,我知道WebSphereApplicationServer可以配置为对bean实例的数量有一个严格的上限,但这不是默认的。我想我不完全理解…你知道,如果我们在给定的时间有10个机顶盒为每个服务一个请求,并且我们得到第11个请求,那么可以创建另一个bean来避免排队??