JSF, EJB, JPA - Dobra praktyka

0

W swojej aplikacji mam kilka tabel, które bardzo często będą odczytywane przez użytkowników.
Zastanawiam się czy lepiej będzie jeżeli utworze beana o zasięgu @ApplicationScope i umieszczę w nim wszystkie Tabele (encje JPA).
Drugą możliwością jest utworzenie zapytań nazwanych (@NamedQuery) i odwoływanie się do nich za każdym razem gdy zajdzie taka potrzeba (czyli bardzo często), licząc, że dane zostaną pobrane z puli.
Jak myślicie, które rozwiązanie jest lepsze?

0

Jezeli dane zmieniaja sie rzadko to je cache'uje czyli tak jak napisales np w beanie

lub użyj mechanizmów JPA do cechowania

0

Cache JPA w wersji Hibernate ma domyślnie włączony tylko jeden poziom. włącz drugi poziom cache dla tych encji i będzie po sprawie. Jedna wada jak będzie dużo zapytań aktualizujących to i tak będzie szło z bazy.

0

A Ty jak zwykle glupoty pierdzielisz. Skad wiesz ze cache jest wylaczony? Ze specyfikacji na temat elementu <shared-cache-mode> w persistence.xml:

Defines whether caching is enabled for the persistence unit if caching is supported by the persistence
provider. When set to ALL, all entities will be cached. When set to NONE, no entities will be cached. When
set to ENABLE_SELECTIVE, only entities specified as cacheable will be cached. When set to
DISABLE_SELECTIVE, entities specified as not cacheable will not be cached. When not specified or when
set to UNSPECIFIED, provider defaults may apply.

Zatem wcale nie musi byc jak mowisz. Nie wprowadzaj w blad.

  • Mowa o JPA2, jako ze autor uzywa @ApplicationScoped czyli CDI uzywa Java EE 6, czyli JPA2. W JPA1 nie ma 2nd-level cache.
0

@jambalaya: dlatego piszę o implementacji Hibernate, gdzie 2nd lvl cache był od zawsze: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache i można było go włączać i wyłączać niezależnie czy używałeś JPA/JPA2 czy nie. Domyślnie jest on wyłączony ponieważ wymaga dość dużo pamięci i obniża wydajność zapytań DML.
Cache pierwszego poziomu w hibernate może być sterowany za pomocą persistance.xml (w praktyce hibernate ma odpowiedni adapter do tłumaczenia konfiguracji JPA<>Hibernate). Jest domyślnie włączony.

Warto też pobawić się z Query Cache: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-querycache jeżeli dane, które wyświetlamy, są pobierane co do zasady z tymi samymi parametrami.

0

Jako dostawce JPA używam EclipseLinka. Do cacheowania użyłem adnotacji @Cacheable, ale nic to nie dało. W logach Glassfisha widać, że za każdym razem generowane jest zapytanie do bazy danych. Chyba, że coś robię nie tak?

1 użytkowników online, w tym zalogowanych: 0, gości: 1