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

9
我知道:
对于无状态会话Bean,服务器可以在池中维护可变数量的实例。 每当客户端请求这样的无状态Bean(例如通过方法)时,都会选择一个随机实例来服务该请求。
我的问题是:为什么需要池? 一个EJB无状态Bean的实例不应该足以服务所有请求吗?
此外,如果服务器针对特定无状态Bean使用了10个实例的池, 那么10是否是它可以处理此类Bean上的最大请求数?
你能帮我解决疑问吗?
编辑:
ejb 3.1规范第4.3.14节给出了答案。
序列化会话Bean方法的要求适用于无状态和有状态会话Bean。有关单例会话Bean并发要求,请参见第4.8.5节。
容器将调用每个有状态和无状态会话Bean实例的调用进行序列化。大多数容器将支持许多会话Bean实例同时执行;但是,每个实例只看到一系列方法调用的序列化。因此,有状态或无状态会话Bean无需编码为可重入。
容器必须串行化所有容器调用的回调(即业务方法拦截器方法、生命周期回调拦截器方法、超时回调方法、beforeCompletion等),并且必须将这些回调与客户端调用的业务方法调用一起串行化。
在网上搜索一下,我猜测线程池对于规范是必要的,规范要求EJB无状态方法是线程安全的。 因此,如果我们有10个Bean在池中,只有10个请求可以同时服务,其他请求将排队并分配给第一个空闲的Bean。 如果我错了,请纠正我。

请查看以下链接:http://www.adam-bien.com/roller/abien/entry/do_we_need_stateless_session 和 https://dev59.com/aHVC5IYBdhLWcg3w9GLM - Thiago Bonfante
我已经阅读了那些资源,但仍然没有找到令人满意的答案... - GionJh
我在这篇帖子中发现,EJB容器“必须确保同时只有一个线程执行实例”,但“可以交错处理来自多个事务的请求到同一实例”- 这两者是矛盾的,因为通常单独的事务=单独的线程。 我会建议引入池来实现第一个,而在@PreConstruct上节省时间是一个免费的甜蜜补充。 - dma_k
3个回答

3
如果您创建了一个无状态会话bean,它不关心哪个客户端在调用,它允许您在多个客户端之间重复使用实例,这将提高应用程序的性能,这是无状态会话bean和有状态会话bean之间的主要区别之一。
有状态会话bean将为每个客户端创建一个实例,并降低应用程序的性能,因为您将同时拥有许多实例。
拥有一个池可以根据应用程序的负载增加无状态EJB实例的数量:)
编辑
如果您只需要一个实例处理所有请求,您可以使用单例会话bean而不是无状态会话bean。无状态会话bean适用于不需要状态的操作,这些操作将帮助您提高性能。
如果您有一个包含10个实例的池,则可以接收任意数量的请求,但仅有10个实例将处理它们。

1
如果您有一个有10个实例的池,您可以接收任意数量的请求,但只有10个实例将处理它们。这意味着只能同时处理10个请求。 - GionJh
正如编辑所说,无状态会话Bean实例池通常不会像JDBC连接池那样在达到硬上限时阻塞请求。这取决于实现方式;例如,我知道WebSphere应用服务器可以配置为对bean实例数量设置硬上限,但这不是默认设置。 - Brett Kail
1
我认为我没有完全理解...你的意思是,如果在某个特定时间有10个STB,每个STB提供一个请求,而我们收到第11个请求,那么可以创建另一个bean以避免排队吗? - GionJh

2

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

另外,如果针对一个无状态bean的服务器正在使用10个实例的池,那么10是它可以处理这种bean的最大请求数吗?

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


他问道:“一个EJB无状态bean的实例不应该足以处理所有请求吗?”你解释了对象池的目的,但没有解释为什么单个EJB可以/不能处理所有请求。 - Dioxin
单个无状态 EJB 实例理论上可以处理所有请求,但太慢了。为什么会变慢?单个实例将在不同的线程上运行。假设有100个线程正在运行单例对象,则另外10个无状态对象使用相同数量的线程处理相同的流量。那么性能是否相同? - roconmachine

-2

无状态的EJB并不是真正无状态的。(当然?)

我来解释一下。无状态的EJB会有一些状态,比如用于判断EJB是否正在运行或休眠、EJB是否已加载等的标志。也就是说,无状态的EJB有隐藏字段


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接