【问题标题】:CDI & JPA: Best scope for repository classesCDI & JPA:存储库类的最佳范围
【发布时间】:2013-03-23 18:23:51
【问题描述】:

我想知道 CDI 中存储库类的最有效(就所需资源而言)范围是什么。想象以下场景:

@RequestScoped
//OR @ApplicationScoped OR @SessionScoped OR @ConversationScoped?
public class SomeRepository{
  @Inject 
  private EntityManager em;

  public SomeClass getSomeClassById(int id){
    return em.createNamedQuery("getSomeClassById",SomeClass.class).
             setParameter("id",id).getSingleResult();
   }
}

该示例中的 EntityManager 是使用 @RequestScoped 范围生成的。

【问题讨论】:

    标签: java-ee-6 cdi scopes


    【解决方案1】:

    我认为有趣的问题。出乎意料的是,我想不出任何使这些课程特别的东西。因此,我将它们设为@ApplicationScoped,因为新实例的功能与我刚刚丢弃的实例完全相同。不确定它会对堆产生任何明显的影响,可能不会,但如果它们必须重新创建很多?

    我认为选择概念上更适合你的东西是可以的。

    【讨论】:

    • 但是@ApplicationScoped 的意思是“每个应用程序只有一个实例”,对吗?如果一次收到数千个请求,这会导致这个类成为瓶颈吗?
    • @user1727072 一点也不。范围内没有内置并发管理。在这种情况下,它也是线程安全的,因为您只向真正的实体管理器注入了一个代理,并且每个调用都将被转发到正确的实例。 ApplicationScoped 是单例模式——每个人都可能同时使用同一个实例
    • iirc 来自 EJB 的 @Singleton 默认是线程安全的,也许这就是你的想法。
    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2011-05-13
    • 2020-10-25
    • 2016-12-13
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多