【问题标题】:How is threadsafty guranteed with @PersistenceContext?@PersistenceContext 如何保证线程安全?
【发布时间】:2010-01-06 18:17:30
【问题描述】:

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

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

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

【问题讨论】:

  • 好问题...我经常想知道 JEE5+ 实现中线程安全的具体细节。

标签: java multithreading dependency-injection ejb-3.0


【解决方案1】:

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

至于@Singleton bean,spec 表示默认情况下它们使用容器托管并发,其中容器使用方法Locks,如果单例繁忙,则可能会以超时异常拒绝客户端。

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

【讨论】:

  • 我同意你的观点,尽管可以自定义锁定单例。但还有一点:注入仅在创建 bean 时执行,然后由多个调用者使用(并发或不并发)。
  • 持久化上下文默认是事务范围的。
猜你喜欢
  • 2012-06-19
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多