Friday, September 02, 2005

ODBMS vs. RDBMS - czyli wydajność i wygoda vs popularność i dostępność ;)

Przez kilka ostatnich dni zajmuję się tworzeniem aplikacji, której wydajność jest kluczowa - to czy będzie działać kilka procent szybciej ma ogromne znaczenie. Dlatego też staram się na wszystkim oszczędzać - na ilości przesyłanych danych (bo to aplikacja klient-serwer), ilości tworzonych nowych wątków do obsługi żądań, no i na czasie wykonywania operacji na bazie danych.

Przyznam, że dotychczas jeśli chodzi o aplikacje bazodanowe to tworzyłem je tylko w oparciu o relacyjne bazy danych (zarówno w Javie, jak i w PHP). Jakiś czas temu zacząłem też używać frameworków do mapowań O/R (JDO, Hibernate, Propel). Nigdy jednak nie pomyślałem, że zastosowanie tych technologii może być niewłaściwe dla jakiejkolwiek aplikacji. A jednak...

Dziś w tworzeniu web-aplikacji używa się niemal jedynie relacyjnych baz danych (sam nie znam żadnej PHP-owej witryny, która by używała czegoś innego). Rzeczywistość pokazuje jednak, że w przypadku baz danych, do których wysyła się dużą liczbę zapytań takie rozwiązanie wcale nie jest wydajne, a nawet wygodne(!).

Programując systemy z użyciem obiektowych języków prorgamowania chciałoby się używać tylko i wyłącznie tego języka i niczego więcej. Tymczasem programując aplikacje bazodanowe z użyciem RDBMS trzeba mieć na względzie strukturę bazy danych, wiedzieć jak taka baza pracuje, martwić się wieloma niepotrzebnymi rzeczami. Najgorsze jest jednak to, że taka baza nie przechowuje obiektów a jedynie zbiory rekordów, które muszą być mapowane na obiekty (lub na odwrót). Tu z pomocą przychodzą narzędzia O/R - JDO, Hibernate (Hibernate+Spring+Transakcje), Propel - jednak zastanówmy się jakim kosztem ? Im więcej warstw pośrednich, tym mniejsza wydajność aplikacji. Pójdę jeszcze o krok dalej - a czy w ogóle JDBC jest wydajne? Przecież dla każdej kolumny w zapytaniu JDBC tworzone są nowe obiekty - a duża ilość takich operacji może znacznie obciążyć naszą aplikację.

Tu z pomocą przychodzą obiektowe bazy danych - proste, wydajne, łatwe w użyciu, a przede wszystkim "obiektowe" ;) Prevayler to jedna z najpopularniejszych ODBMS dla Javy. Zakłada ona, iż wszystkie dane pochodzące z naszej aplikacji będą trzymane w pamięci operacyjnej RAM. Ktoś mógłby powiedzieć: "No dobrze, to po co w ogóle używać bazy danych skoro wszystko może być w pamięci RAM". Oczywiście można trzymać wszystkie obiekty w RAMie, ale przeszukanie ich może zająć bardzo dużo czasu (o ile nie napisze się jakiegoś własnego wydajnego mechanizmu, ale to już sie mija z celem ;) Aplikacja używająca Prevayler musi więc sama zarządzać tworzeniem zrzutów bazy danych (backup na wypadek awarii lub restartu serwera). Ponadto trzeba się liczyć z tym, że jeśli ilość danych będzie bardzo duża to zajmie dużo miejsca w pamięci operacyjnej - a przecież nie mamy jej w nieskończonych ilościach. Powracając do sedna sprawy, czyli wydajności - ile taka baza jest szybsza od np. bazy MySQL ? Odpowiedź może być zaskakująca - kilkaset-kilka tysięcy razy szybsza (!). Zachęcam do zapoznania się z wynikami testów wydajnościowych na stronie projektu (czytając go trzeba mieć na względzie, że testy te dotyczą tylko prostych zapytań, nie ma np. porównania z testami na SQLu wykorzystującymi złączenia, procedury, widoki itp.).

Nieco "ulepszoną" wersją dla Prevayler jest db4objects - baza, która potrafi już bezpośrednio operować na plikach (oczywiście kosztem wydajności). Projekt ten posiada 2 licencje: GPL i komercyjną. Gorąco zachęcam to zapoznania się z obiema technologiami, bo naprawdę warto. Sam zastanawiam się, którą z nich wybrać - prawdopodnie do prostych systemów, w których nie jest aż tak ważne "bezpieczeństwo danych" (chodzi o możliwość utraty niektórych danych w przypadku awarii) oraz ilość danych nie przekracza kilkudziesięciu MB Ramu - użyję Prevayler. W innych sytuacja db4objects może okazać się dobrym rozwiązaniem.

Na forum Java.net można przeczytać mój wątek o porównaniu ODBMS i RDBMS.

4 comments:

Anonymous said...

Polecam zapoznanie się z http://patsystem.sourceforge.net/
Jest to oparty o Prevaylera framework pozwalający na zapewnienie trwałości danych w sposób przezroczysty (użycie adnotacji z Javy 1.5 lub commons-annotations).

Bezpieczeństwo danych jest wysokie -- prevayler zapewnia dziennikowanie transakcji.
Do wyszukiwania danych można użyć JXpath lub szukać samemu. Wydaje mi się, że nawet 'ręczne' przeszukanie drzewa obiektów będzie trwało krócej niż wysyłanie zapytań do bazy.

Unknown said...

Przyznam, że PatSystem to całkiem dojrzały projekt. W dodatku naszej rodzimej produkcji (autorem jest Piotr Nazar) :D W ciągu najbliższych dni zapoznam się z nim, być może napiszę jakiś wątek na tym blogu o doświadczeniach z nim związanych.

Anonymous said...

Sprostowanie: autorem jest Tomasz Nazar ;p

Unknown said...

Upss... rzeczywiście. Sam nie wiem czemu napisałem Piotr ;) Niniejszym przeprosiny dla autora i jego przyjaciół (Pawła Wielgusa
i Andrzeja Krzywdy).