gpt4 book ai didi

performance - @EJB 注入(inject)与查找 - 性能问题

转载 作者:行者123 更新时间:2023-12-04 16:32:30 26 4
gpt4 key购买 nike

我有一个与使用 @EJB 注释时可能的性能问题有关的问题。想象以下场景

public class MyBean1 implements MyBean1Remote{
@EJB
private MyBean2Remote myBean2;
@EJB
private MyBean2Remote myBean3;
...
@EJB
private MyBean20Remote myBean20;
}

有一个 bean 与其他 bean 有许多依赖关系。根据 EJB 规范,如果我想将 MyBean1Remote 注入(inject)到其他某个 bean,容器必须从其池中获取所有必需的依赖项,然后将其注入(inject) MyBean1Remote,然后注入(inject)对 MyBean1Remote stub 的引用。

因此在以下场景中容器需要保留 20 个 ejb(myBean1 及其 19 个依赖项)
public class MyAnotherBean implement MyAnotherRemote{
@EJB
private MyBean1Remote myBean1
}

假设在大多数情况下,我们将为 myBean1 的每个业务方法仅使用一个依赖项。因此,每次我们想要注入(inject)该 bean 时,我们都会强制容器保留许多不必要的 EJB。让我们还假设我们正在对远程 bean 进行操作,因此容器可能还需要在注入(inject)依赖 bean 之前执行一些负载平衡算法。

问题:
  • 在集群环境中运行时,这不会导致不必要的资源预留和更多的性能问题吗?
  • 也许好的旧 ServiceLocator 可能是更好的解决方案,因为使用这种方法,我们会在真正需要时要求特定的 EJB?
  • 最佳答案

    容器不注入(inject) EJB 的实例;它注入(inject)实现所需接口(interface)的轻量级容器生成的代理对象的实例。

    public class MyBean1 implements MyBean1Remote {
    ...
    }

    public class MyAnotherBean implement MyAnotherRemote {
    @EJB
    private MyBean1Remote myBean1;
    }

    在您的示例中,MyAnotherBean.myBean1 将被注入(inject)一个实现 MyBean1Remote 接口(interface)的代理对象。

    假设 无国籍 session bean(因为您提到了池化),容器不会从方法就绪池中分配实际的 EJB 实例,直到在代理上调用方法,并且在代理方法调用返回之前将实例返回到池中。

    关于performance - @EJB 注入(inject)与查找 - 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753449/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com