@PersistenceContext如何保证线程安全?

时间:2010-01-06 18:17:30

标签: java multithreading dependency-injection ejb-3.0

根据许多示例,可以将EntityManager注入@Stateless或@Singleton EJB,如下所示:

@Stateless // or @Singleton
public class MyRepository {
   @PersistenceContext
   private EntityManager em;
   ...
}

EJB 3.1 Spec表示依赖注入仅在构造时执行,因此MyRepository的所有调用者都将使用相同的EntityManager实例。 EJB容器如何确保使用正确的EntityManager实例?

1 个答案:

答案 0 :(得分:3)

我的理解是两个客户端永远不会同时使用@Stateless bean;如果需要为多个客户端提供服务,容器将只创建同一个bean的更多实例。

对于@Singleton bean,spec表示默认情况下它们使用容器管理并发,容器使用方法Lock并且如果单例,则可以拒绝具有超时异常的客户端很忙。

编辑:此外,@PersistentContext类型默认为事务范围(规范中为16.11.1.1),因此EntityManager管理的所有实体在每次事务结束时都会被分离。