gpt4 book ai didi

java - 多线程servlet;单线程EJB

转载 作者:行者123 更新时间:2023-12-02 08:26:02 25 4
gpt4 key购买 nike

在传统的 n 层 Web 应用程序中,servlet 用于 Web 层,ejbs(2.0) 用于业务层,使 servlet 模型成为多线程而 ejb 模型成为单线程的基本原理是什么?
即所有请求只有 1 个 servlet 实例,但对于 ejbs,每个请求都会从 bean 池中分配一个新的 bean 实例。

最佳答案

特定 Servlet 确实只有一个实例,因为它们应该是无状态的。实际上,情况并非总是如此,但也只能这样了。

但是,有多个无状态 session Bean (SLSB) 实例,并且这些实例被池化。

根据其定义,无状态 session Bean 是无状态的,因此从表面上看,这似乎像是一个悖论。问题是,虽然无状态 session Bean 对于对它们进行的单独调用来说是无状态的,但实际上它们通常具有状态。

此状态采用对其他资源的引用的形式。 线程安全的JPA实体管理器就是一个典型的例子。在对无状态 session bean 的单次调用期间,调用者必须具有对此资源的独占访问权。当调用返回时,下一个调用者可以拥有独占访问权限,等等。

如果使用单个实例,那么所有调用者要么必须互相等待(这当然会影响性能),要么他们将同时访问这个单个实例。在后一种情况下,bean 实现者必须手动锁定非线程安全资源,例如实体管理器,这通常很脆弱、容易出错,并且最终仍然导致调用者等待每个资源。其他。

所以,为了提高性能,同时仍然有安全保障,采用了多实例的方式。

然后,这些实例将被池化并重新使用,而不是为每个请求重新创建,因为查找、初始化和注入(inject) Bean 所需的所有依赖项可能会非常耗时。

因此,所有这些自动意味着如果您将实体管理器或其他非线程安全资源注入(inject)到 Servlet 中(这是允许的),您可能会遇到问题。这是 Java EE 架构中的一个小漏洞,当然可以通过简单地使用无状态 session bean 轻松解决。

关于java - 多线程servlet;单线程EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4498234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com