如何为数据库只读检索EntityManager的实例

时间:2019-01-31 01:05:59

标签: jersey entitymanager

我正在使用Jersey进行RESTful Web服务。该服务应该仅读取数据库实体(每个操作读取不同的表),并且不需要与任何其他应用程序进行通信。

我尝试研究创建EntityManager的最佳实践,该实践对于只读操作是最佳的,但是我找不到特定的答案。 我了解可以有容器管理的或应用程序管理的实体管理器。我目前正在使用应用程序管理的实体管理器。

现在,我已经创建了如下的实体管理器:

public class EMFactory implements Factory<EntityManager>{

 @Inject
 public EMFactory(EntityManagerFactory emf, CloseableService closeService) {
    this.emf = emf;
    this.closeService = closeService;
 }

  public EntityManager provide() {
    final EntityManager em = this.emf.createEntityManager();
    this.closeService.add(() -> em.close());
    return em;
  }
}

我还有如下的AppConfig类

import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

public class AppConfig extends AbstractBinder {
    @Override
    protected void configure() {
        bindFactory(EMFFactory.class).to(EntityManagerFactory.class).in(Singleton.class);
        bindFactory(EMFactory.class).to(EntityManager.class).in(RequestScoped.class);
    }
}

我的问题是

  • 我可以使用@ javax.persistence.PersistenceContext创建EntityManager(由容器管理)吗?这是最佳选择吗?
  • 我还读到最好每个线程保留一个EntityManager实例,因为EntityManager不是线程安全的。对于数据库只读操作是否需要考虑这一点?目前,每个Web服务请求都将创建一个EntityManager实例。
  • 或者我应该为整个应用程序使用一个EntityManager实例吗?

谢谢。

更新

以下解决方案也对我有用,但是我不确定让EntityManager Singleton一直打开并保持最佳状态是否是最佳实践。

 public class EMFactory implements Factory<EntityManager>{

 @Inject
 public EMFactory(EntityManagerFactory emf, CloseableService closeService) {
    this.emf = emf;
 }

  public EntityManager provide() {
    final EntityManager em = this.emf.createEntityManager();
    return em;
  }
}



import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

public class AppConfig extends AbstractBinder {
    @Override
    protected void configure() {
        bindFactory(EMFFactory.class).to(EntityManagerFactory.class).in(Singleton.class);
        bindFactory(EMFactory.class).to(EntityManager.class).in(Singleton.class);
    }
}

0 个答案:

没有答案