Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程servlet;单线程ejb_Java_Servlets_Ejb - Fatal编程技术网

Java 多线程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具有状态,因此每个

在传统的n层web应用程序中,servlet用于web层,ejb(2.0)用于业务层,使servlet模型多线程和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中),还是必须彼此等待(如同步的方法)。