![]() |
Post Page Rank |
Singleton Beans
Ideą wzorca projektowego Singelton jest zapewnienie by dana klasa
posiadała tylko jedną instancję, do której istnieje globalny dostęp.
Wzorzec ten posiada rzeszę zwolenników i zagorzałych przeciwników. Można
go kochać albo nienawidzić. Niechęć do stosowania tego wzorca powodowana
jest w dużej mierze niemożnością bądź olbrzymimi trudnościami do
zapewnienia jego poprawnego działania w środowisku rozproszonym.
Istnieje wiele rozwiązań, jak choćby JBoss Cache, OSCache, JCS,
SwarmCache czy komercyjny Tangosol Coherence i Terracotta. Nie są one
jednak pozbawione pewnych słabości. Rozwiązania te nie są transakcyjne,
nie posiadają mechanizmów zabezpieczeń. Wreszcie nie są uznane za
standard.
EJB 3.1 oferuje nowy rodzaj komponentów sesyjnych – Singleton Bean.
Są to, podobnie jak pozostałe rodzaje komponentów, zwykłe klasy POJO
oznaczone adnotacją @Singleton. Zgodnie z nową specyfikacją kontener
gwarantuje utrzymanie pojedynczej instancji komponentu. Jako, że jest to
EJB, nasz Singelton posiada dostęp do wszystkich mechanizmów kontenera:
transakcji, zabezpieczeń, wstrzykiwania zależności, etc.
Do czego można wykorzystać taki komponent? Wszędzie tam gdzie
potrzebujemy pamięci podręcznej, chcąc uniknąć czasochłonnych odwołań do
bazy danych. Dane te mogą być pobrane podczas tworzenia Singleton’a i
przechowywane w nim do momentu jego usunięcia. Kontener daje gwarancje,
że zawsze odwołujemy się do tej samej instancji komponentu i mamy dostęp
do tej samej wersji danych.
Poniższy kod przedstawia przykład takiego komponentu.
@Singleton
public class SingletonBean {
@PersistenceContext
private EntityManager em;
private List<Dane> daneCache;
@SuppressWarnings("unchecked")
@PostConstruct
private void start() {
daneCache = em.createQuery("SELECT d FROM Dane d")
.getResultList();
}
@PreDestroy
private void stop() {
em.merge(daneCache);
}
@ConcurrencyAttribute(READ_LOCK)
public List<Dane> getDane() {
return daneCache;
}
@ConcurrencyAttribute(READ_WRITE_LOCK)
public void addDane(Dane dane) {
this.daneCache.add(dane);
}
}
Adnotacja @ConcurrencyAttribute określa blokowanie konkurencyjnych
wywołań danej metody.

Wpisy (RSS)