我知道:
对于无状态会话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。 如果我错了,请纠正我。
对于无状态会话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。 如果我错了,请纠正我。
@PreConstruct
上节省时间是一个免费的甜蜜补充。 - dma_k