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.

Strony: 1 2 3 4

Pozostaw odpowiedź