Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 EJB实例变量线程安全_Java_Jpa_Ejb_Server - Fatal编程技术网

Java EJB实例变量线程安全

Java EJB实例变量线程安全,java,jpa,ejb,server,Java,Jpa,Ejb,Server,据我所知,无状态EJB线程安全来自以下事实 对同一SLSB的并发请求将由该特定bean的不同部分提供服务,每个部分都有自己的实例变量 例如,如果无状态ejb有一个实例变量,例如int计数器, 每个池EJB将使用不同的计数器变量 这是否也适用于注入变量,如以下示例所示: @Stateless public class User implements UserHomeLocal, UserHomeRemote { @PersistenceContext(name="J2EE") p

据我所知,无状态EJB线程安全来自以下事实
对同一SLSB的并发请求将由该特定bean的不同部分提供服务,每个部分都有自己的实例变量

例如,如果无状态ejb有一个实例变量,例如int计数器, 每个池EJB将使用不同的计数器变量

这是否也适用于注入变量,如以下示例所示:

@Stateless
public class User implements UserHomeLocal, UserHomeRemote
{

    @PersistenceContext(name="J2EE")
    private EntityManager manager;
}
更一般地说:是否有任何情况下,池bean可以共享依赖注入的实例变量?

EJB规范说

容器序列化对每个有状态和无状态会话的调用 bean实例。大多数容器将支持多个 会话bean并发执行;但是,每个实例只看到 方法调用的序列化序列。因此,有状态或 无状态会话bean不必编码为可重入的

这意味着默认情况下它是线程安全的。不需要额外的努力。同时请注意,无状态bean应该是“无状态的”

无状态bean具有可变状态不是一个好主意。这正是造成灾难的原因。如果您需要在所有实例之间共享一个变量,那么它需要是一个静态变量。EJB规范使用静态可变变量(类级变量,如跟踪所有实例的所有请求的计数器)。基本上,“读取或写入非最终静态字段”是受限的

所以,要使池bean共享一个实例变量,该变量应该是静态的、最终的。如果您查找此文件是出于任何实现原因,您可以签出。一旦创建了单例bean,就可以将其注入会话bean中。但我不确定这是否值得


是的,实体管理器或任何此类Java EE对象(例如,对Java持久性实体管理器或有状态会话bean的引用)将被共享,并保证默认情况下是线程安全的(在无状态下)

我根本不想在bean之间共享实例变量,在这种情况下,我要问的是每个bean是否会有一个不同的EntityManager实例?我会努力改进我的答案。不是我,我认为你应该得到+1,甚至是最好的答案。如果您可以澄清的话,还有一点,我在哪里可以阅读所有这些具体细节,例如“实体管理器或任何此类Java EE对象(例如,对Java持久性实体管理器或有状态会话bean的引用)将被共享,并保证默认情况下是线程安全的(在无状态下)”。谢谢