pobierz plik referatu - BDAS
Transkrypt
pobierz plik referatu - BDAS
Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 Rozdział 17 w Ocena wydajności narzedzi Object-Relational Mappers na podstawie testu OO7 w 1 Wstęp da .b w Streszczenie. Na rynku istnieje wiele narzędzi ORM pozwalających na utrwalanie obiektów klas języka Java bez utraty relacji między obiektami, dziedziczenia, polimorfizmu albo kolekcji. Dla trzech wybranych narzędzi (Castor, Hibernate, OJB) zaimplementowano test OO7– standardowy zestaw eksperymentów do badania wydajności obiektowych baz danych. Dokonano porównania przyjętego modelu danych z modelem testu OO7. Rozdział prezentuje wyniki oraz wnioski z przeprowadzonych testów nawigacji. pl s. Coraz więcej projektów informatycznych stosuje obiektowe języki programowania, takie jak Java lub C# do budowy logiki biznesowej oraz relacyjne baz danych do przechowywania obiektów. Między tymi elementami (pierwszym obiektowym i drugim relacyjnym) istnieje różnica. Programiści radzą sobie z tym problemem w taki sposób, że odwzorowują obiekty na tabele w relacyjnej bazie danych. Obecnie znaleźć można wiele produktów umożliwiających operowanie na relacyjnych bazach danych w sposób obiektowy. Do oceny wydajności architektury obiektoworelacyjnej wybrano dwa tego typu systemy: Castor - http://www.castor.org/status.html oraz Hibernate - http://www.hibernate.org/4.html. Trzeci z testowanych systemów - Jakarta OJB - http://db.apache.org/ojb/features.html jest zgodny ze standardem Java Data Object [2]. W pracy - ze względu na ograniczoną objętość rozdziału - opisano jedynie eksperymenty dotyczące nawigacji. Wyniki z eksperymentów dotyczących zapytań oraz modyfikacji opisane zostały w opracowaniu [3]. 2 Test OO7 - struktura wewnętrzna bazy testowej Pierwotnie test OO7 [1] został przygotowany z myślą o porównywaniu wydajności aplikacji korzystających z obiektowych baz danych. Test ten został zaplanowany w taki sposób, aby zasymulować pracę prawdziwego systemu typu CASE. Obejmuje on wiele Dariusz Król: Politechnika Wrocławska, Instytut Informatyki Stosowanej, Wybrzeże Wyspiańskiego 27, 50-370 Wrocław, Polska email: [email protected] Bartłomiej Knabel: LUKAS Bank SA, pl. Orląt Lwowskich 1, 53-605 Wrocław, Polska email: [email protected] (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 D. Król, B. Knabel w hierarchicznych powiązań między obiektami (1:1, 1:n, m:n). Dzięki wyodrębnieniu szeregu parametrów, jest wysoce konfigurowalny. Kluczowym elementem testu OO7 jest zestaw, czyli zbiór części złożonych. Każda taka część stanowi odpowiednik procedury w aplikacji typu CASE (a więc jest to pewien element projektowy) i posiada dwa atrybuty typu całkowitego: id (identyfikator) oraz data (data utworzenia) oraz jeden typu znakowego: typ (typ elementu). Z każdą częścią złożoną związany jest dokument. Składa się on z identyfikatora typu całkowitego oraz z dwóch atrybutów typu znakowego: tytuł oraz tekst. Atrybutami pojedynczej części atomowej (oprócz identyfikatora, typu, daty) są dwa pola będące liczbami całkowitymi. Data generowana jest jako liczba losowa z przedziału od 1000 do 1999. Każda część atomowa związana jest z kilkoma innymi za pomocą dwukierunkowego połączenia uzyskanego za pomocą obiektu połączenie. Liczba połączeń jest ustanawiana poprzez parametr LiczbaPolaczenNaAtom. Parametr ten może przybierać wartość 3, 6 lub 9 i jest on odpowiedzialny za tzw. wypełnienie bazy. Połączenia wewnątrz grafu generowane są w sposób losowy, jednak algorytm dba o to, aby każdej części atomowej przypisać po jednym połączeniu w taki sposób, aby stanowiły one pierścień. Struktura wewnętrzna testu OO7 wprowadza pojęcie zestawu podstawowego, który zawiera części złożone, co zostało pokazane na rys. 1. Istnieje również, składający się z zestawów podstawowych, zestaw złożony. Nadrzędnym elementem tej hierarchii jest klasa moduł. Dzięki takiemu porządkowi baza jest konfigurowalna i to na wielu poziomach. Przykładowo, moduły mogą symulować pracę kilku użytkowników. Z modułem skojarzona jest klasa manual, która jest wykorzystywany do operacji na dużych i nieskomplikowanych obiektach. Ponadto moduł przechowuje indeks korzenia hierarchii zestawów. Każdy zestaw posiada identyfikator, datę typu całkowitego oraz pole typ typu znakowego. Zestaw złożony może być połączony identyfikatorem z zestawem podstawowym (niekoniecznie jednym), a zestaw podstawowy z częścią złożoną (jedną lub więcej). da .b w w 3 Porównanie przyjętego modelu danych z modelem testu OO7 pl s. Jak już wcześniej wspomniano, model danych testu OO7 został zaprojektowany z myślą o symulacji pracy aplikacji typu CASE. Jednak z powodu parametryzacji, może on charakteryzować dowolną aplikację opierającą się na obiektowej bazie danych. W proponowanym rozwiązaniu przyjęto pewien model klas oraz dziedziczenia między nimi. Abstrakcyjną klasą bazową jest element projektowy. Zawiera ona (oprócz identyfikatora) atrybuty typ oraz data, a w modelu istnieje aż pięć klas rozszerzających tą klasę. Są to: moduł, zestaw złożony, zestaw podstawowy, część złożona oraz część atomowa. Pozostałe klasy, takie jak manual, dokument i połączenie nie są związane z żadną inna klasą. Na szczycie hierarchii znajduje się moduł, który posiada wskaźnik do manuala. Kolejnym poziomem jest drzewo składające się z zestawów złożonych oraz podstawowych. 168 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 Ocena wydajności narzedzi Object-Relational Mappers na podstawie testu OO7 1 -glownyZlozony Modul -modul * 1 -manual 1 Manual -modul * ZestawZlozony * -zestawZlozony -ZlozonyNadrzedny 1 -zestawyZlozone 1 * ZestawPodstawowy -ZestawyZlozone -zestawyPodstawoweDzielace w * -zestawyPodstawoweNieDzielace -czesciZlozoneNieDzielone CzescZlozona * -czesciZlozoneDzielone w * Rys. 1. Ogólny diagram UML dla modelu danych testu OO7 w Każdy zestaw podstawowy łączy się z wieloma częściami złożonymi relacją m:n. Pierwotna wersja testu OO7 przewidywała dwa rodzaje takich powiązań: pierwszy typ „prywatny” dla jednego modułu, drugi „współdzielony” między modułami. Ponieważ implementacja testu ograniczała się do jednego modułu, w toku dalszych prac zrezygnowano z definiowania różnych typów powiązań. 1 da .b CzescZlozona -czescZlozona 1 1 -dokument 1 * -czescZlozona -czesciAtomowe Dokument CzescAtomowa 1 -glownaAtomowa * -zAtomowej -polaczenieDo * * * -doAtomowej -polaczenieZ Polaczenie pl s. Rys. 2. Szczegółowy diagram UML dla części złożonej Każda część złożona posiada powiązanie 1:1 z dokumentem oraz z częścią atomową. Części atomowe powiązane są między sobą za pomocą obiektu połączenie. Każda część atomowa może być powiązana z innymi na takich samych zasadach, jak to było opisane wcześniej. Powiązane połączeniami części atomowe należą zawsze do tej samej części złożonej. Podsumowując, wprowadzono następujące różnice w stosunku do modelu zaproponowanego przez autorów testu OO7 [1]: − implementacja nie zawiera abstrakcyjnej klasy zestaw, − data jest typu java.util.Date, zamiast Integer, − zamiast tablicy znaków używano typu java.lang.String, − używano standardowych kolekcji Javy (np. ArrayList). Większość z wprowadzonych zmian związana jest ze zmianą języka programowania na język Java. 169 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 D. Król, B. Knabel 4 Opis eksperymentów Eksperymenty zaimplementowano w środowisku Eclipse 3.1 z wykorzystaniem JRE w wersji 1.5. Serwer aplikacyjny stanowił Apache Tomcat w wersji 5.0.27. Zarówno badania, jak i implementacja prowadzone były w systemie Windows XP. Do testów wykorzystano systemy mySQL 4.0.17, Castor 0.9.6, Hibernate 3.0 oraz OJB 1.0.3. Podstawowe parametry testów zostały przedstawione w tabelach 1 i 2. w Tabela 1. Opis parametrów testu Opis LiczbaCzANaCzZ Liczba części atomowych przypadająca na część złożoną. LiczbaPolaczenNaAtom DlugoscDokumentu Liczba połączeń dwukierunkowych z jednej części atomowej. Długość atrybutu tekst obiektu Dokument. DlugoscManuala Długość atrybutu tekst obiektu Manual. LiczbaCzZłozNaModul Liczba części złożonych znajdujących się w module. LiczbazestWZestZl Liczba zestawów w zestawie złożonym. LiczbaPoziomow Liczba poziomów w hierarchii zestawów. da .b w w Nazwa parametru LiczbaCzZWZestPdst Liczba części złożonych w zestawie podstawowym. LiczbaModulow Liczba modułów. W związku z tym, że dla daty używano typu java.util.Date, należało wprowadzić nowe zakresy generowanych wartości (rys. 3). Częśći złożone historyczne Częśći złożone aktualne Zestawy podstawowe 1-1998 1-2000 1-2001 1-2002 1-2003 1-2004 1-2005 2005-12-31 pl s. 1997 -01-01 1-1999 Rys. 3. Graficzne przedstawienie wieku części złożonych oraz zestawów podstawowych Przyjęto następujące oznaczenia: − M3, M6 i M9 - małe bazy zawierające odpowiednio 58 tys. obiektów, 88 tys. obiektów i 118 tys. obiektów; − D3, D6 i D9 - duże bazy zawierające odpowiednio 508 tys. obiektów, 808 tys. obiektów i 1 mln 108 tys. obiektów. Tabela 2. Dobór parametrów używanych podczas generowania danych Nazwa parametru M3 M6 M9 D3 D6 D9 LiczbaCzANaCzZ 20 20 20 200 200 200 LiczbaPolaczenNaAtom 3 6 9 3 6 9 DlugoscDokumentu 2000 2000 2000 20 000 20 000 20 000 170 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 Ocena wydajności narzedzi Object-Relational Mappers na podstawie testu OO7 100000 100000 100000 1000000 1000000 1000000 LiczbaCzZlozNaModul 500 500 500 500 500 500 LiczbaCzestWZestZl 3 3 3 3 3 3 LiczbaPoziomow 7 7 7 7 7 7 LiczbaCzZWZestPdst 3 3 3 3 3 3 LiczbaModulow 1 1 1 1 1 1 w DlugoscManuala W kolejnych punktach opracowania przeanalizowano mechanizmy nawigacji zgodnie ze specyfikacją testu OO7. w 4.1 Nawigacja (1). Raw traversal speed w Nawigacja (1) rozpoczyna się od wywołania metody nawigacja() dla modułu. Dzięki rekurencyjnej nawigacji zestawów złożonych, zgodnie z hierarchią zestawów, odwiedzane zostają wszystkie jego zestawy złożone, a następnie podstawowe. Dla każdego odwiedzonego zestawu podstawowego następuje odwołanie do wszystkich prywatnych części złożonych i związanych części atomowych (metoda nawigacja()). złożo na Zestaw złożony nawigacja() Ze s taw y po d sta wo w e Zestaw podstawowy Czę ś d zie ći nie lon e nawigacja() Głó wn aa nawigacja() tom ow a Część atomowa Połączenie Po la c zen ieD o Część złożona Po łac ze n ie Z nawigacja() Zestawy złożone da .b Głów na Moduł nawigacja() { nicNieRob(); } Rys. 4. Schemat nawigacji (1) pl s. Wszystkie odwiedzane części atomowe zostają zliczone, a dla każdej z nich wywoływana zostaje pusta metoda nicNieRob(). Fakt, że metoda ta nie wykonuje żadnych obliczeń, jest istotny dla nawigacji (1). Dzięki temu czas trwania eksperymentu pozwala określić szybkość przeszukiwania w głąb. czas [s] 400 300 200 100 0 M3 Castor gorący zimny M6 M9 Hibernate gorący zimny D3 D6 D9 OJB gorący zimny Rys. 5. Wyniki nawigacji (1) 171 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 D. Król, B. Knabel w Opisany eksperyment wykazał znaczne różnice między poszczególnymi narzędziami ORM. System OJB przy zimnym, czyli pustym buforze dla najmniejszej bazy (M3) potrzebował aż 157 [s] przy 38 [s] dla Hibernate. Podobnie dla większych baz testowych – najgorzej radził sobie OJB, Castor okazał się być niewiele lepszy. W przypadku dużych baz danych, poradził sobie tylko Hibernate. W systemie OJB najlepiej działa bufor. Czasy uzyskiwane przy rozgrzanym buforze nie przekraczają jednej sekundy, co jest wynikiem lepszym od zimnego startu o ponad 200%. Hibernate przy gorącym starcie jest lepszy o około 10% dla małych baz – dla dużych różnica jest prawie niezauważalna. Najmniej z pamięci podręcznej potrafi korzystać Castor, który tylko dla najmniejszej bazy poprawia się po pierwszej iteracji. Nawigacja (1) przechodzi przez wszystkie poziomy hierarchii obiektów testu OO7 i mówi o szybkości dostępu do metod „zanurzonych” najgłębiej, bo zaimplementowanych dla części atomowej. Przeprowadzony eksperyment dowodzi, że narzędzia ORM takiego obiektowego zadania nie potrafią wykonać szybko. Testy wykonywane były na szybkim komputerze, a trwały nawet 400 [s]. Jedynie system OJB na gorącym buforze działał stosunkowo szybko. w w 4.2 Nawigacja (2). Traversal with field updates nawigacja() Głów na złożo na Zestaw złożony nawigacja() Zwstawy złożone Zes taw y po d sta wo w e Zestaw podstawowy Czę ś dzie ći nie lo n e nawigacja() Głó wn aa nawigacja() tom ow a Część atomowa Połączenie Po la c zen ieD o Część złożona Po łac ze n ie Z Moduł da .b Nawigacja (2) w sposobie poruszania się po obiektach nie różni się od nawigacji (1). Różnica polega na tym, że dla części atomowej zamiast metody pustej, zostaje wywołana metoda zamienXY(), która dokonuje zamiany wartości nieindeksowanych atrybutów. nawigacja() { pl s. wariant B - 1x wariant C - 4x zamienXY(); } Część atomowa wariant A - 1x nawigacja() { zamienXY(); } Rys. 6. Schemat nawigacji (2) Nawigacja (2) występuje w trzech wariantach: metoda zamienXY() wywoływana jest tylko dla jednej części atomowej przypadającej na część złożoną, metoda zamienXY() uruchamiana jest dla wszystkich części atomowych przypadających na część złożoną, metoda zamienXY() uruchamiana jest cztery razy dla wszystkich części atomowych przypadających na część złożoną. 172 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 Ocena wydajności narzedzi Object-Relational Mappers na podstawie testu OO7 czas [s] 300 250 200 150 100 50 0 M3 M6 w Castor gorący zimny M9 D3 Hibernate gorący zimny D6 D9 OJB gorący zimny Rys. 7. Wyniki nawigacji (2a) w da .b w Nawigacja (2a) potwierdza wniosek z nawigacji (1) wskazujący na niewielką rolę pamięci podręcznej w systemach Castor i Hibernate. Po raz kolejny start z gorącym buforem niewiele przyspieszył wykonanie operacji. Pod tym względem najlepszy jest system OJB. Nawigacja (1) nie dokonywała żadnych zmian, co powodowało, że na gorącym buforze OJB działało błyskawicznie. W przypadku aktualizacji jednej części atomowej czas przebiegu eksperymentu w porównaniu z nawigacją (1) na gorącym buforze wzrósł z 0,1 do 7 [s]. Porównując wyniki nawigacji (1) z nawigacją (2a) – rys. 5 i rys. 7 - można zauważyć, że są one bardzo do siebie zbliżone, a w niektórych przypadkach różnice między nimi są niezauważalne. czas [s] 400 300 200 100 0 M3 Castor gorący zimny M9 Hibernate gorący zimny D3 D6 D9 OJB gorący zimny pl s. Rys. 8. Wyniki nawigacji (2b) M6 Nawigacja (2b) dokonuje o wiele więcej aktualizacji niż poprzedni eksperyment. Aktualizowana jest każda z części atomowych. Czasy uzyskane na zimnym buforze, są zbliżone do wyników nawigacji (2a). Ciekawe wnioski można wysunąć obserwując wyniki tego doświadczenia dokonane z gorącą - pełną pamięcią podręczną. Okazuje się, że systemowi Castor sprawia trudność dokonywanie wielu aktualizacji. Czasy z gorącym startem są gorsze niż z pustym buforem. Tendencja taka jest tym większa, im większa baza. Potwierdza to wcześniejsze obserwacje, w myśl, których wewnętrzne struktury danych dobrane są w sposób nieoptymalny. Większa ilość danych znajdująca się w pamięci podręcznej powoduje wolniejsze przetwarzanie. Wyraźnie więcej czasu potrzebuje OJB, gdy posiada już pewną ilość danych w buforze. Jedynie dla systemu Hibernate szybkość nawigacji (2b) pozostaje podobna do tej z nawigacji (2a). 173 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 D. Król, B. Knabel czas 700 [s] 600 500 400 300 200 w 100 0 M3 M6 Castor gorący zimny M9 D3 D6 Hibernate gorący zimny D9 OJB gorący zimny w Rys. 9. Wyniki nawigacji (2c) da .b w Wyniki nawigacji (2c) pokazują, że systemy Hibernate i Castor nie korzystają z bufora. O wiele gorzej prezentuje się OJB, ponieważ jest on ponad 2 razy wolniejszy od pozostałych. Sytuacja taka ma miejsce zarówno dla gorącego, jak i dla zimnego bufora. Takie zachowanie OJB może być zdeterminowane nieefektywnymi strukturami danych w buforze, albo dokonywaniem wielokrotnej fizycznej aktualizacji w bazie danych. 4.3 Nawigacja (3). Traversal with indexed field updates Nawigacja (3), podobnie jak nawigacja (2), mierzy szybkość aktualizacji pól w części atomowej. Tym razem jednak dotyczy ona pola data, które jest w bazie danych polem indeksowanym. Wywoływana metoda zmienDate() działa w taki sposób, że datę parzystą zwiększa, natomiast datę nieparzystą zmniejsza o jeden dzień. Podobnie jak dla nawigacji (2), zwracana jest liczba dokonanych aktualizacji. nawigacja() Głów na złożo na Zestaw złożony Ze s taw y po d sta wow e Zestaw podstawowy Czę ś d zie ći nie lo n e nawigacja() pl s. nawigacja() Zestawy złożone wariant B - 1x wariant C - 4x tom ow a Część atomowa nawigacja() { zamienDate(); } Część atomowa wariant A - 1x nawigacja() { zamienDate(); } Rys. 10. Schemat nawigacji (3) 174 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Połączenie ieD o nawigacja() Głó wn aa Po la c zen Część złożona Po łac ze n ie Z Moduł Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 Ocena wydajności narzedzi Object-Relational Mappers na podstawie testu OO7 czas [s] 300 200 100 0 M3 M6 M9 w Castor gorący zimny D3 Hibernate gorący zimny D6 D9 OJB gorący zimny Rys. 11. Wyniki nawigacji (3a) w Nawigacja (3a) zachowuje się bardzo podobnie jak nawigacja (2a), choć wyraźnie widać, że różnią się skalą. Wykresy przedstawione dla nawigacji (3) dochodzą w skrajnym przypadku do 700 [s], przy niecałych 500 [s] dla nawigacji (2). w czas [s] 400 300 da .b 200 100 0 M3 M6 M9 Castor gorący i D3 Hibernate gorący zimny D6 D9 OJB gorący zimny Rys. 12. Wyniki nawigacji (3b) pl s. Nawigacja (3b) potwierdza wnioski dotyczące nawigacji (2a) oraz (3a). Po raz kolejny daje się zaobserwować, że wyniki są bardzo zbliżone. Najbardziej wrażliwym systemem na indeksowanie jest Castor, gdyż właśnie w jego przypadku czas wzrósł najbardziej. Jeśli chodzi o OJB i Hibernate, to obserwowane różnice są nieznaczne. czas [s] 700 600 500 400 300 200 100 0 M 3 Castor gorący i M 6 M9 Hibernate gorący zimny D3 D6 D9 OJB gorący zimny Rys. 13. Wyniki nawigacji (3c) 175 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006 Rozdział monografii: 'Bazy Danych: Struktury, Algorytmy, Metody', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2006 D. Król, B. Knabel Nawigacja (3c) nasuwa nieco inne spostrzeżenia. Hibernate oraz OJB pozostały na podobnym poziomie, tak jak to było dla nawigacji (3a) i (3b). Różnica działania Castora dla nawigacji (3c) w porównaniu do nawigacji (2c) praktycznie jest niezauważalna. 5 Wnioski z przeprowadzonych badań w Literatura 1. 2. 3. 4. da .b w w Przeprowadzone testy pokazały, że ten sam eksperyment może trwać różnie długo, w zależności od wybranego narzędzia a różnice mogą wynosić nawet kilkadziesiąt sekund. Świadczy to o tym, że kod SQL jest generowany w różny sposób. W zdecydowanej większości eksperymentów pamięć podręczna działała na tyle źle, że niejednokrotnie jej obecność nie odbijała się korzystnie na wynikach. Wyjątkiem było OJB, w którym pamięć podręczna działała prawidłowo. Pozostałe narzędzia albo zbyt często porównywały zawartość bufora ze stanem faktycznym w bazie danych, albo też zbyt rzadko z niego korzystały. Ważnym spostrzeżeniem jest fakt, że przeniesienie systemu z jednej relacyjnej bazy danych na inną nie stanowi z reguły problemu. Wystarczy tylko dograć odpowiedni sterownik oraz zmienić informacje w pliku konfiguracyjnym. Implementacja testu okazała się być prosta jedynie z teoretycznego punktu widzenia. Pierwsze próby uruchomienia każdego z wymienionych narzędzi kończyły się błędem. Świadczy to o tym, że narzędzia ORM znajdują się jeszcze w początkowej fazie rozwoju. pl s. Carey M.: The OO7 Benchmark. Computer Science Tech. Report, University of WisconsinMadison, 1994. Knabel B.: Uniwersalny dostęp do baz danych w środowisku J2EE. Praca magisterska, Politechnika Wrocławska, 2005. Król D., Knabel B.: Wyszukiwanie danych w bazie danych na platformie J2EE. Prace Naukowe Instytutu Informatyki Stosowanej Politechniki Wrocławskiej, Bazy Danych, Zeszyt 7, 2006. Szpunar Z., Wróblewski A.: Rzutowanie modelu obiektowego do relacyjnego modelu danych. Prace Naukowe Instytutu Informatyki Stosowanej Politechniki Wrocławskiej, Bazy Danych, Zeszyt 6, 2005, 51-66. 176 (c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2006