gpt4 book ai didi

java - 带有实例变量的无状态 session bean

转载 作者:太空狗 更新时间:2023-10-29 22:48:59 24 4
gpt4 key购买 nike

我有一个无状态 session bean,它包含一个公共(public)方法、几个私有(private)方法和一些实例级变量。下面是一个伪代码示例。

private int instanceLevelVar

public void methodA(int x) {
this.instanceLevelVar = x;
methodB();
}

private void methodB() {
System.out.println(instanceLevelVar);
}

我看到的是 methodB 正在打印未传递到 MethodA 的值。尽我所知,它是从同一 bean 的其他实例打印值。什么会导致这种情况?

我应该指出代码在 99.9% 的时间内都按预期工作。然而,0.01% 给我带来了一些严重的问题/担忧。

我知道如果我有不同的公共(public)方法,那么我可能不会在调用之间返回相同的 bean,这将导致这种行为。但是,在这种情况下,唯一的调用是对单个公共(public)方法的调用。容器(在本例中为 Glassfish)是否仍会在私有(private)方法调用之间交换 bean?

(编辑)我将“类级别”重命名为“实例级别”,因为这引起了一些困惑。

最佳答案

当我读到What is a Session Bean? J2EE 1.4 教程部分:

Stateless Session Beans

A stateless session bean does not maintain a conversational state for a particular client. When a client invokes the method of a stateless bean, the bean's instance variables may contain a state, but only for the duration of the invocation. When the method is finished, the state is no longer retained. Except during method invocation, all instances of a stateless bean are equivalent, allowing the EJB container to assign an instance to any client.

在您的情况下,从 methodA() 调用 methodB() 将在同一个实例上,等同于 this.methodB()。因此,我倾向于说 methodB() 不能输出传递给 methodA() 的值。

EJB 2.0 spec 中第 7.11.8 节的第一句话证实了这一点: “容器必须确保任何时候只有一个线程可以执行一个实例”。 这意味着您不能遇到来自不同客户端(线程)的数据(在您的实例变量中)将被混合。在 methodA() 返回之前,您可以确保对实例变量的唯一访问权!

也就是说,我并不是说您在某个地方没有问题。但我不认为你的伪代码是等价的。

(编辑:阅读了对 OP 问题的一些评论后,现在显然对使用的伪代码和语义有疑问。我在下面澄清可能的后果。)

正如 Rocket Surgeon 所强调的,类变量到底是什么意思?你真的是指类变量而不是实例变量吗?如果是,伪代码不会反射(reflect)它,但这显然会导致不可预测的行为。实际上,从 EJB 2.0 规范的第 24.1.2 节(和第一点)可以清楚地看出,您不能将数据写入类变量(尽管您可以这样做)。这一定有充分的理由:)

关于java - 带有实例变量的无状态 session bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1628009/

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