JavaEE6 DAO: powinno być @Stateless czy @ApplicationScoped?

Obecnie tworzę klasę dostępu do danych EJB3 do obsługi wszystkich operacji bazodanowych w mojej aplikacji Java EE 6. Skoro Java EE 6 udostępnia nową aplikację-adnotację, to zastanawiam się jaki powinien mieć stan mój EJB, czy powinien być bezpaństwowy.

Kto lepiej niech DAO będzie fasolą @ Stateless Session, czy fasolą @ ApplicationScoped? A co z @ Singleton? Jakie są różnice między tymi opcjami związane z DAO?

EDIT: Używam Glassfish 3.0.1 z pełną platformą Java EE 6

Author: Arjan Tijms, 2010-07-11

3 answers

Czy lepiej niech DAO będzie fasolą @ Stateless Session, czy fasolą @ ApplicationScoped? A co z @ Singleton? Jakie są różnice między tymi opcjami związane z DAO?

Nie użyłbym Stateless Session Beans dla DAOs:

  1. EJB są gromadzone przez kontener, więc jeśli masz N instancji na pulę i tysiące tabel, po prostu marnujesz zasoby (nie wspominając nawet o kosztach w czasie wdrażania).

  2. Wdrożenie Dao jako SLSB zachęciłoby do łączenia EJB, co nie jest dobrą praktyką z punktu widzenia skalowalności.

  3. Nie przywiązywałbym warstwy DAO do API EJB.

@Singleton wprowadzony w EJB 3.1 może nieco poprawić sytuację, ale i tak nie zaimplementowałbym DAOs jako EJB. Wolałbym użyć CDI (i może niestandardowego stereotypu, patrz ten artykuł na przykład).

Albo w ogóle nie używałbym DAOs. Podmiot JPA menedżer jest implementacją wzorca Domain Store i owijanie dostępu do sklepu domeny w DAO nie wnosi wiele wartości.
 13
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-11 20:58:30

Po pewnym przemyśleniu, wydaje się, że DAO nie jest właściwą nazwą dla tego, co chciałem zrobić. Może to naprawdę jest Fasada, jak powiedział Pascal. Właśnie znalazłem przykład Netbeans Petstore-przykładową aplikację JavaEE6, zobacz Tutaj - gdzie mająItemFacade , który jest odpowiedzialny za znajdowanie/tworzenie/usuwanie encji z bazy danych. To Bezpaństwowa fasolka. Wygląda tak:

@Stateless
public class ItemFacade implements Serializable {
    @PersistenceContext(unitName = "catalogPU")
    private EntityManager em;

    public void create(Item item) { ... }
    public void edit(Item item) { ... }
    public void remove(Item item) { ... }
    public Item find(Object id) { ... }
    public List<Item> findAll() { ... }
    public List<Item> findRange(int maxResults, int firstResult) { ... }
    public int getItemCount() { ... }
}

Więc na zakończenie nie nazywam już mojego DAO DAO, ale zamiast wystarczy na przykład PersonEJB (myślę, że "PersonFacade" może być źle zrozumiane) i zrobić to również @ Stateless, ponieważ myślę, że przykład Netbeans można uznać za dobrze zaprojektowany.

 1
Author: ifischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-14 14:29:54

@Pascal: Moim zdaniem moje DAO nie jest "odpowiedzialne" za transakcję lub bezpieczeństwo, ponieważ kontener zarządza tymi usługami. Po prostu opisuję metody w moim DAO (tylko dla bezpieczeństwa, ponieważ transakcje są obsługiwane automatycznie). Czy adnotacje są już "odpowiedzialne"?

OK, więc każesz mi przemyśleć mój projekt. Mam nadzieję, że jest w porządku i nie jest zbyt off-topic, ale może to pomaga - Tak dzisiaj używam JEE6:

  • JSF uzyskuje dostęp do CDI Bean,
  • / Align = "center" bgcolor = "# E0FFE0 " / Cesarz Chin / / align = center/ DAO-EJB, który czy "logika biznesowa"
  • więc obecnie moja jedyna "logika biznesowa" robi CRUD, później dodam kilka innych EJB dla krytycznych zadań, takich jak metody asynchroniczne lub usługi timera.
  • mój DAO jest generyczny i używa Jpa2 Criteria Query do wykonywania typesafe queries (no strings at all)
  • wiem, że nie potrzebuję DAO dla persist / update/remove (zbyt proste), ale potrzebuję go dla moich zapytań; więc po prostu je poskładałem

Czy coś jest nie tak z tym podejście?

 0
Author: ifischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-11 23:33:28