在 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容器倍增bean时,当client从JNDI中查找时,当client调用bean实例的方法时?
当您使用 @EJB
注入 EJB 时,实际上您已经获得了此 EJB 的代理,而不是特定的 bean 实例。通过使用这个代理容器 selects 从 beans 池中获取一个 bean 实例。使用您的示例 - 这样两个单独的客户端请求 servlet 可以由两个单独的 EJB bean 实例提供服务,所以这绝对不是瓶颈。
当池中 select 没有可用的空闲实例时,容器可以创建新的 bean 实例(前提是当前活动 bean 实例的数量不超过最大 bean 池大小)。这是在客户端(例如 servlet)向 EJB bean 发送请求(调用方法)以执行操作时完成的。
我可以建议您,如果您想观察 EJB bean 实例的创建时间,您可以阅读 @PostConstruct
带注释的方法。
据我所知,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容器倍增bean时,当client从JNDI中查找时,当client调用bean实例的方法时?
当您使用 @EJB
注入 EJB 时,实际上您已经获得了此 EJB 的代理,而不是特定的 bean 实例。通过使用这个代理容器 selects 从 beans 池中获取一个 bean 实例。使用您的示例 - 这样两个单独的客户端请求 servlet 可以由两个单独的 EJB bean 实例提供服务,所以这绝对不是瓶颈。
当池中 select 没有可用的空闲实例时,容器可以创建新的 bean 实例(前提是当前活动 bean 实例的数量不超过最大 bean 池大小)。这是在客户端(例如 servlet)向 EJB bean 发送请求(调用方法)以执行操作时完成的。
我可以建议您,如果您想观察 EJB bean 实例的创建时间,您可以阅读 @PostConstruct
带注释的方法。