据我所知,EJB容器有会话bean的池。即当客户端从JNDI查找bean时,ejb容器会创建新实例或从池中返回它。 无状态会话bean的一个实例正在做一个请求,当其他请求来到这个bean时,ejb容器创建新的或从池返回。
一切正常,但假设我们Inject
bean进入Servlet
@Stateless
public class StatelessBean {}
@WebSerlvet
public class Servlet extends HttpServlet {
@EJB
StatelessBean bean;
public void doPost() {
bean.handle();
}
Servlets实例总是一个。当多个客户端请求此servlet时,仅在不同的Thread中运行。因此,注入的Stateless Bean
由这些线程共享。所以当多线程调用bean.handle()
方法时,
答案 0 :(得分:0)
当您使用@EJB
注入EJB时,实际上您已经获得了此EJB的代理,而不是特定的bean实例。通过使用此代理容器,从Bean池中选择一个bean实例。使用您的示例 - 这样两个单独的客户端对servlet的请求可以由两个单独的EJB bean实例提供服务,所以这绝对不是瓶颈。
当没有可用于从池中选择的可用实例时,Container可以创建bean的新实例(前提是当前活动Bean实例的数量不超过最大bean池大小)。这是在客户端(例如servlet)向EJB bean发送请求(调用方法)以执行操作时完成的。
我可以建议您,如果您想观察何时创建EJB bean实例,您可以阅读有关@PostConstruct
注释方法的内容。