【问题标题】:EJB injection and ejb poolEJB 注入和 ejb 池
【发布时间】:2015-09-01 13:05:32
【问题描述】:

假设我们有 2 个 EJB(例如无状态)A 和 B。

@Stateless
public class A {
    @EJB
    protected B binstance;
}

所以在我们在 servlet 中使用了 A bean 之后,它应该返回到池中,问题是 EJB 容器是否从 A 中“取消引用”B 实例,即在下一次调用时,我们可以在同一个 B 中获取另一个 B 对象一个实例? 当我们创建一个 bean REST 服务并在那里注入一些其他 bean 时,这对 JAX-RS 是否仍然有效?在这个意义上,JAX-RS bean 是像 servlet 还是像普通的 EJB 实例一样创建(我的意思是 servlet 仍然持有对 bean 实例的引用)?

【问题讨论】:

  • JAX-RS 资源本身不能合并。从 Java EE 7(和 EJB 3.2)开始,如果您将 JAX-RS 与 EJB 结合使用(即使用 @Stateless 注释 JAX-RS 资源),则 JAX-RS 将被合并。当它从池中加载时,它的所有依赖项都将被临时连接(对于所有无状态注入的 EJB 也是如此)。
  • 问题是在 A 被放入池中之前 B 会发生什么? B 是否从 A 中取消引用,并且 A 和 B 都独立池化,或者只有 A 返回到池中(因为它引用了 B,那么 B 怎么会池化呢?)

标签: jakarta-ee ejb ejb-3.0


【解决方案1】:

好的。因此,让我们从无状态 bean 开始。在无状态 bean 的情况下,对象池由 bean 容器控制。它可以在第一个和第二个请求中提供相同的对象,也可以提供不同的对象。因此,在编码时,请记住这一点。

现在来到 Bean A 和 Bean B,当 Bean A 执行完成时,Bean B 可能会被取消引用。因为这完全由 Bean 容器根据负载以及 bean A 调用之间的持续时间来确定。 所以永远不要依赖,你每次都会得到相同的 Bean B 对象。

在 JAX-RS 的情况下,其余实例的创建方式与普通 EJB 实例一样。如果 rest bean 是无状态的,则对其应用无状态 bean 规则。在这种情况下,您也无法控制在副官休息呼叫中提供给您的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多