Laboratorium nr 10 - Budziki i związki


Budzi w Javie

W Javie za powiadamianie o zdarzeniach czasowych odpowiadają klasy: java.util.Timer i java.util.TimerTask.

Budziki EJB (od wersji 2.1)

Beany rejestrują się w TimerService, który będzie je powiadamiał przy pomocy metod zwrotnych. Obecnie nie dotyczy to Statefull SB. Jak budzik był dla EB, to usunięcie ziarna pozbędzie się też budzika. Ważne klasy: Operacje na budzikach (tworzenie, usuwanie) wchodzą w skład transakcji.

Ćwiczenie 1

Co się stanie jak pobierzemy Timer z serwisu, a ziarno nie implementuje TimedObject

Ćwiczenie 2

Przygotuj system realizacji zleceń giełdowych. Klienci komunikują się z systemem przy pomocy Fasady i proszą o wykonanie operacji kupna/sprzedaży podając cenę, liczbę akcji, rodzaj akcji i okres trwania oferty. Jeżeli zlecenia nie daje się do końca zrealizować w danym momecie (nikt nie oferuje/poszukuje dostatecznej liczby akcji spełniających kryteria), to na pozostającą liczbę akcji tworzona jest oferta (przechowywana jako EB), która będzie brana pod uwagę przy kolejnych operacjach. Po upłynięciu okresu trwania oferty jest ona usuwana.

Ćwiczenie 3

Co zrobić, żeby pewne czynności były wykonywane o 4:00, w każdy dzień roboczy. Jak należał zaprojektować usługę budzenia EJB żeby było to prostrze?

Związek w wersji BMP

Związek w wersji CMP

Kierunek związku

Związki mogą być jedno lub dwukierunkowe. Nie ma to nic wspólnego z tym jak dane są przechowywane w bazie, ale gdzie są pola pozwalające na nawiagację.

Ćwiczenie 4

Podać kod OsobaBean, jeżeli związek Osoba-Student jest:

Ćwiczenie 5

Jakie zagrożenia niesie używanie interfejsów zdalnych dla EB będących w związkach.

Leniwe wgrywanie

Pokazany kod zakłada agresywne wgrywanie (ejbLoad() punkt 3). Dla małych grafów to dobre, bo wszystko wgrywamy w jednej transakcji z bazą. Dla dużych grafów, np. przy związkach wiele do wiele, jest zagrożeniem dla efektywności. Agresywne wgrywanie może powodować zapętlenie (np. trzy ziarnowy cykl i zapętlamy się na wyszukiwaniu). Leniwie możemy wgrywać osobę na podstawie klucza w getOsoba(). W CMP wystarczą odpowiednie definicje w deskryptorach kontenera.

Więzy spójności

Można zrobić w bazie danych przy pomocy odpowiednich więzów i trigerów. Można zrobić w bazie danych przy pomocy procedur składowanych. Można zrobić w EJB, przykładowo agregacja całkowita (w przeciwieństwie do agregacji) powinna powodować kaskadowe kasowanie (np. ejbRemove() Osoby wywołuje remove() na Studencie). W CMP zajmuje się tym kontener.

Ćwiczenie 6

Zaimplementować związki z Oraclowego schematu Emp-Dept-Salgrade. Dodać konieczne więzy spójności. Do wyboru przy pomocy BMP lub CMP.