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
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:
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).
Wdrożenie Dao jako SLSB zachęciłoby do łączenia EJB, co nie jest dobrą praktyką z punktu widzenia skalowalności.
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).
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.
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?
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