在 Servlet 瓶颈中注入 EJB bean

inject EJB bean in Servlet BOTTLENECK

据我所知,EJB 容器具有会话 bean 的池。即,当客户端从 JNDI 查找 bean 时,ejb 容器创建新实例或 returns 从池中创建它。 无状态会话 bean 的一个实例在同一时间执行一个请求,当其他请求到达此 bean 时,ejb 容器从池中创建新的或 returns。

一切正常,但假设我们 Inject 变成了 Servlet

@Stateless
public class StatelessBean {}

@WebSerlvet
public class Servlet extends HttpServlet {
    @EJB
    StatelessBean bean;

    public void doPost() {
         bean.handle();
    }

Servlets 实例总是一个。当多个客户端请求此 servlet 时,仅在不同线程中 运行。因此 Injected Stateless Bean 由这些线程共享。所以当多线程调用bean.handle()方法时,

当您使用 @EJB 注入 EJB 时,实际上您已经获得了此 EJB 的代理,而不是特定的 bean 实例。通过使用这个代理容器 selects 从 beans 池中获取一个 bean 实例。使用您的示例 - 这样两个单独的客户端请求 servlet 可以由两个单独的 EJB bean 实例提供服务,所以这绝对不是瓶颈。 当池中 select 没有可用的空闲实例时,容器可以创建新的 bean 实例(前提是当前活动 bean 实例的数量不超过最大 bean 池大小)。这是在客户端(例如 servlet)向 EJB bean 发送请求(调用方法)以执行操作时完成的。

我可以建议您,如果您想观察 EJB bean 实例的创建时间,您可以阅读 @PostConstruct 带注释的方法。