会话 Bean(无状态会话 bean、有状态会话 bean)是否同步?
5 回答
一次只有一个线程会访问您的 bean。由应用程序服务器来管理它。所以你不应该在你的 bean 中使用同步。这就是为什么像 EntityManager 这样的非线程安全可以是实例值并且没有同步问题的原因。
无状态 bean:每个线程/请求都会从池中获取不同的 EJB 实例。SLB 不应该持有任何用户会话数据,任何状态。相同的代码可以并行执行。一个实例一次由一个线程访问。
Statefull bean为用户会话同步。每个用户都将获得自己的会话范围实例。第二个线程/请求将等到第一个线程完成。有状态的 EJB 可以保存用户特定的数据。一个用户不能并行执行相同的代码。不同的用户可以并行执行相同的代码。
如果访问不允许并行访问的资源,请使用Singleton EJB。顾名思义,只有一个实例。默认情况下,EJB Singleton 只能由一个线程访问(Container Managed Concurrency 和@Lock(WRITE))。
无状态/有状态会话 bean 是线程安全的。因为每个请求都会得到一个专用的bean实例,所以不需要同步。
单例会话 bean 是共享的,需要由容器(Container Managed Concurrency - CMC)或用户(Bean Managed Concurrency - BMC)同步。
关于 EJB bean 非常真实的一点是,一旦您创建了 EJB 3.0 bean,那么默认情况下,EJB 的方法是同步的。
例如
@Statelss 类 EJB 类 {
无效一些方法(){}
}
现在,如果您将其设置为 someMethod Synchronize,它将显示错误,因为它已同步,因此无法在此级别进行同步。
EJB 3.0 Bean 很聪明,性能也很好。
企业 Java bean 不同步。由于会话 bean 由 ejb 容器维护,因此您必须在应用程序级别实现同步逻辑。