Должны ли Guo-Injected DAO быть синглетонами? - PullRequest
5 голосов
/ 03 марта 2012

В настоящее время я работаю над приложением, использующим Guice / JPA / Hibernate для получения информации из моей базы данных.

Я прочитал документы Guice по работе с JPA и EntityManagars здесь: http://code.google.com/p/google-guice/wiki/JPA,

Но у меня возникают проблемы с пониманием, когда я должен сделать свои реализации DAO Singletons.

Я прочитал этот вопрос о S / O относительно использования Spring DAO, где написано:

Создание DAO для каждого запроса было бы сумасшествием.

Это переносится для контейнеров DI, отличных от Spring?Если я внедряю провайдера DAO в свой сервлет и при необходимости вызываю его, должна ли реализация службы DAO быть единичной?

Вот базовая схема одного из моих DAO:

public DAOImpl implements DAOService { <-- SHOULD THIS BE ANNOTATED @Singleton?

    @Inject
    private EntityManager em;
    // OR 
    // @Inject 
    // private Provider<EntityManager> emProvider - If it's a singleton.

    @Inject
    DAOImpl(OtherServices os) {
        this.otherServices = os;
    }

    @Transactional
    public MyPersistedObject getPersistedObject(long id) {
        MyPersistedObject mpo = em.find(MyPersistedObject.class, id);
        return mpo;
    }
}

И как это называется:

   @Singleton
   public MyServlet(HttpRequest req, HttpRequest res) 
           extends ServletInterfaceOfTheDay {

       private final daoService; // If Singleton
       // OR
       // private final Provider<DAOService>; If Instanced DAO

       @Inject
       MyServlet(DAOService dao) {
           this.daoService = dao;
       }

       // Gather Information from request here...

       MyPersistedObject mpo = daoService.getPersistedObject(requestIdInfo);
       // OR daoService.get().getPersistedObject(requestIdInfo);

       // Process Response Info here....

   }

Спасибо за помощь.

Ответы [ 2 ]

5 голосов
/ 03 марта 2012

Нет, поскольку EntityManager абсолютно не ориентирован на многопотоковое исполнение.Вам нужно использовать провайдеров.

0 голосов
/ 26 июля 2012

Да, DAO должны быть одиночными, но EntityManager должен быть получен через провайдера.

...