Java 多线程servlet;单线程ejb
在传统的n层web应用程序中,servlet用于web层,ejb(2.0)用于业务层,使servlet模型多线程和ejb模型单线程的基本原理是什么?Java 多线程servlet;单线程ejb,java,servlets,ejb,Java,Servlets,Ejb,在传统的n层web应用程序中,servlet用于web层,ejb(2.0)用于业务层,使servlet模型多线程和ejb模型单线程的基本原理是什么? i、 e对于所有请求只有一个servlet实例,但是对于EJB,对于每个请求,都有一个从bean池分配的新bean实例。我认为典型的servlet呈现了EJB中实现的重逻辑的瘦外观。servlet应该是无状态的,因此没有理由创建同一servlet的多个实例 如果您只使用无状态bean,我认为没有理由拥有多个实例。但状态完整的EJB具有状态,因此每个
i、 e对于所有请求只有一个servlet实例,但是对于EJB,对于每个请求,都有一个从bean池分配的新bean实例。我认为典型的servlet呈现了EJB中实现的重逻辑的瘦外观。servlet应该是无状态的,因此没有理由创建同一servlet的多个实例 如果您只使用无状态bean,我认为没有理由拥有多个实例。但状态完整的EJB具有状态,因此每个同时请求都需要实例
我希望我没说废话 一个特定的
Servlet实际上只有一个实例,因为它们应该是无状态的。在实践中,情况并非总是如此,但也可以这样
然而,无状态会话bean(SLSB)有多个实例,这些实例是池化的
根据他们的定义,无状态会话bean
是无状态的,因此表面上看这似乎是一个悖论。问题是,无状态会话bean
对于对它们进行的单个调用来说是无状态的,但实际上它们通常具有状态
此状态以引用其他资源的形式出现。JPA实体管理器
,它不是线程安全的,是这里的一个主要示例。在对无状态会话bean的单个调用期间,调用方必须以独占方式访问此资源。当呼叫返回时,下一个呼叫方可以独占访问等
如果使用一个实例,那么所有调用方都必须互相等待(这当然是为了提高性能),或者他们可以同时访问这个实例。在后一种情况下,bean实现者必须手动锁定非线程安全资源,如实体管理器
,这通常是脆弱的、容易出错的,最终仍然会导致调用方互相等待
因此,为了提高性能并仍有安全保证,使用了多个实例
然后,这些实例被合并并重新使用,而不是为每个请求创建新的实例,因为查找、初始化和注入bean的所有必需依赖项可能会非常耗时
因此,所有这些都自动意味着,如果将实体管理器或其他非线程安全资源注入Servlet(这是允许的),则可能会遇到问题。这是Java EE体系结构中的一个小循环漏洞,通过简单地使用无状态会话bean当然很容易解决。SLSB每个JVM有多个实例。.实例数量在bean池中配置非常感谢!因此,从技术上讲,如果SLSB没有访问EntityManager,那么它可以是多线程的(即只有一个实例)?或多或少。但是,如果是这种情况,则不会使用@Stateless注释,而是使用@Singleton。然后只有一个ejbbean实例。您可以通过附加注释来控制是允许多个线程同时访问这样的EJB(如在常规Servlet中),还是必须彼此等待(如同步的方法)。