Как получить экземпляр EntityManager для БД только для чтения - PullRequest
0 голосов
/ 31 января 2019

Я работаю над веб-сервисом RESTful, используя Джерси.Предполагается, что этот сервис предназначен только для чтения сущностей БД (каждая операция читает разные таблицы), и ему не нужно взаимодействовать с каким-либо другим приложением.

Я попытался изучить лучшие практики для создания 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 не является потокобезопасным.Нужно ли учитывать это для операций только для чтения БД?В настоящий момент создается один экземпляр 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);
    }
}
...