当前位置: 首页 > 知识库问答 >
问题:

如何为EJB中的下一次调用保留无状态bean的实例变量的状态?

吕华彩
2023-03-14

我正在阅读JavaEE7文档,下面是关于无状态bean的说明。我不明白下面黑体字的说法是什么意思

无状态会话bean不维护与客户端的会话状态。当客户端调用无状态bean的方法时,bean的实例变量可能包含特定于该客户端的状态,但仅限于调用期间。方法完成后,不应保留客户端特定的状态。然而,客户端可能会更改池化无状态bean中实例变量的状态,并且这种状态将保留到池化无状态bean的下一次调用。除了在方法调用期间,无状态bean的所有实例都是等效的,允许EJB容器将实例分配给任何客户端。也就是说,无状态会话bean的状态应该应用于所有客户端。

然而,在本文中,无状态会话bean中的实例变量

无状态会话bean是一个对象,它没有关联的会话状态,但可能有实例状态。它不允许并发访问bean。实例变量的内容不能保证跨方法调用保存。客户端应将无状态会话bean的所有实例视为相同的。

我觉得这里有矛盾。文档声称(根据我的理解)实例变量状态在下一次调用中被保留,而后一篇文章声称不能保证状态被保留。

请解释一下

附言:我确实读过这篇文章,但我没有掌握答案

无状态会话bean中的实例变量

编辑上面的SO帖子

无状态会话bean(SLSB)不绑定到一个客户机,并且不能保证一个客户机在每次方法调用时获得相同的实例(有些容器可能会在每个方法调用会话中创建和销毁bean,这是一个特定于实现的决策,但实例通常是池化的——我不提集群环境)。换句话说,尽管无状态bean可能有实例变量,但这些字段不是特定于一个客户机的,所以在远程调用之间不要依赖它们。

共有1个答案

靳金鹏
2023-03-14

>

  • SLSB通常以倍数创建,并隐藏在池中。因此,对于EJBUserDataService,将创建和汇集许多实例

    当客户机请求UserDataService的服务时,容器将为其中一个池实例提供服务。任何人。当两个客户端请求相同EJB的服务时,将有两个单独的实例提供服务

    当客户机使用SLSB时,正在使用的实例通常会返回到池中,而不是销毁。这意味着在容器启动时创建的相同的唯一EJB对象可以在容器正常运行期间一直存在于堆中。这需要重复:在容器首次将EJB投入服务时创建和池化的相同SLSB在容器的正常运行期间保持活动状态

    (3)的意思是,如果(2)中的客户机在从池中获取的EJB实例上设置了任何变量,并且EJB被放回池中,获取该实例的下一个客户机将能够看到对该EJB的状态所做的更改(回想一下,池中有(某种程度上)固定数量的EJB实例,它们在请求服务的各种客户机之间循环)。

    无法保证请求客户端将获得哪个UserDataService特定实例。无法保证(2)中的客户机将在对该EJB的两个单独请求上获得相同的UserDataService实例。这就是所谓的无对话状态。您不能保证通过多次调用与该EJB的同一实例通信。这并不意味着EJB在请求过程中被破坏,只是在循环过程中,您无法确定客户端将与哪个实例相关

  •  类似资料:
    • 问题内容: 我有一个无状态会话bean,其中包含一个公共方法,几个私有方法和一些实例级变量。下面是一个伪代码示例。 我看到的是methodB正在打印未传递给MethodA的值。最好的说来,它是从同一bean的其他实例打印值。是什么原因造成的? 我应该指出代码在99.9%的时间内都能正常工作。但是,.01%对我造成了一些严重的问题/担忧。 我知道,如果我使用不同的公共方法,则两次调用之间可能无法获得

    • 问题内容: 在react.js中,将超时引用存储为实例变量(this.timeout)或状态变量(this.state.timeout)更好吗? 要么 这两种方法都有效。我只想知道一个使用另一个的原因。 问题答案: 我建议将其存储在实例上,而不是存储在实例中。每当更新时(应仅按注释中的建议完成),React就会调用并对实际DOM进行任何必要的更改。 由于的值对组件的呈现没有影响,因此不应存在于中。

    • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

    • 我有一个ear,它包含2个war文件,每个war都包含无状态ejb和rest类。接口位于commons中。jar文件。耳朵结构如下所示: 我试图使用无状态-ejb-2中的无状态-ejb-1和注释,但我在部署期间遇到了错误。当我在stateless-EJB-2中使用@EJB时,就部署了ear,但在调用jersey-rest-2时,我遇到了一个远程查找错误。 这是我的方法调用链: 泽西-rest-1

    • 假设我有一个名为db utils的简单库,它有一个CrudService CDIBean(RequestScope),我的web应用程序使用它来执行CRUD操作。 我还有一个名为graddb的EJB项目,它从数据库映射实体。Grad db还具有用于在db utils的CrudService中设置entityManager的生产者。 我已经试过了,显然效果不错。我的问题是:这是一种糟糕的做法吗?在无

    • 在EJB3.1中,在无状态EJB中有一个同步块可以吗? 同步块用于在出现连接错误时更新连接。