BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Bamboo Prevalence – cóż to takiego?

29-12-2004 00:39 | mat_sk
Artykuł prezentuje opis koncepcji Prevalence – polegającej na zastąpieniu relacyjnych baz danych obiektową reprezentacją.

Bamboo Prevalence – cóż to takiego?

Co to jest Bamboo Prevalence??

Aplikacje, w których jest dużo interakcji z danymi, w których przechowuje się dane i przetwarza je praktycznie zawsze są projektowane jako relacyjne bazy danych. Istnieje jednak alternatywa do takiego rozwiązania.

 

Koncepcja Prevalence została wymyślona przez Klausa Wuestefelda i obejmuje poniższe punkty:

 

ü      Wszystkie dane w postaci obiektów znajdują się w pamięci, ponieważ pamięć jest tania.

ü      W regularnych interwałach czasowych, podczas zamykania programu lub w dowolnym momencie na życzenie użytkownika obiekty są serializowane i zapisywane na dysku. Funkcja ta została nazwana snapshot(zdjęcie).

ü      Wszystkie zmiany w obiektach są odnotowywane w plikach commandlog, które są zapisywany na dysku.

 

Te trzy założenia są bardzo proste, ale mimo to dają duże możliwości. Pamięć jest tania - 1 GB pamięci RAM nie jest obecnie ani niespotykany ani drogi. Zapewne dla wielu baz danych taka ilość pamięci w zupełności by wystarczyła.

 

Zapisywanie na dysku plików commandlog daje możliwość odzyskiwania. Jeżeli aplikacja z jakiś powodów zawiesi się lub po prostu przerwie działanie w prosty sposób możemy ją uruchomić ponownie, a wtedy pliki snapshot i commandlog są wykorzystywane i dają możliwość wczytania zapisane i odzyskania niezapisanych danych. 

 

Na stronie  http://www.prevayler.org można znaleźć wyniki porównania mechanizmu Prevalence do MySQL i Oracle. Okazuje się, że działa on odpowiednio 3000 i 9000 razy szybciej. Jednak z wielu powodów możemy nie uważać tego za jakąś znaczącą zaletę. Ważniejsze jest to, że Prevalence może pracować z pojedynczymi obiektami bez jakichkolwiek tabel, rekordów, DataSetów, DataReaderów i SQLi. Wszystko to powoduje, że implementacja staje się łatwa, lekka i przyjemna zarówno podczas tworzenia jak i modernizacji.

 

Bardzo często mimo, że przechowujemy dane w relacyjnej bazie danych, modelujemy ich

chociaż częściowy obraz w postaci obiektów w pamięci. Tutaj nie musimy dbać o to wszystko, co wiąże się z systemem zarządzania relacyjną bazą danych, a zajmujemy się tylko tym, co dotyczy obiektowej reprezentacji danych w pamięci.

 

Zatem stawiamy sobie cel: rezygnujemy z SZRBD, (System Zarządzania Relacyjną Bazą Danych) a wszystkie dane trzymamy w postaci obiektów w pamięci. Praca z danymi znajdującymi się w pamięci wydaje się być świetnym pomysłem. Pozwala to na bardzo szybki dostęp do danych i powoduje znaczne ułatwienia.

 

Zastanówmy się jeszcze nad jedną rzeczą – w jaki sposób Bamboo radzi sobie z zapisywaniem danych na dysku?

Bamboo Prevalence przechwytuje metody, które wywołaliśmy na obiektach i zapisuje

informacje o nich jak również ich parametrach do pliku commandlog. W ten sposób

powstają logi, które mogą być użyte przy restartowaniu systemu lub wszelkiego rodzaju

awariach, w celu odtworzenia wszystkich danych. Bamboo Prevalence wówczas podczas startu wywoła wszystkie metody w odpowiedniej kolejności i wszystkie niezapisane dane, czyli te, dla których nie została wywołana funkcja snapshot zostaną odtworzone. Po tych  operacjach powinniśmy mieć dokładnie takie same dane, jakie mieliśmy przed wyłączeniem systemu.

 

Zobaczmy jak to jest w praktyce.

 

W celu zaprezentowania mechanizmów dostarczanych nam przez Bamboo przedstawimy bardzo prostą aplikację będącą swego rodzaju biblioteczką, do której możemy dodawać książki i pożyczać je.  Aplikacja ta składa się z trzech klas: Ksiazka, Ksiazki i Class1.

Obiekty kalsy Ksiazka reprezentują pojedyncze książki. Obiekt klasy Ksiazki reprezentuje cały zbiór książek przechowywany w Hashtable. Klasa Class1 znajduje się obsługa menu programu w interfejsie konsolowym.

 

Zarys architektury obiektowego modelu danych w dołączonej aplikacji

 

Klasa Ksiazka zawiera atrybuty reprezentujące cechy poszczególnych książek.

[Kod C#]

public class Ksiazka

{

            private int id;

            private string tytul;

            private string autor;

            private DateTime dataWprowadzenia;

            private bool pozyczona;

            ...

}

 

Klasa Ksiazki zawiera Hashtable, przeznaczoną do przechowywania danych o wszystkich książkach.

 

[Kod C#]

public class Ksiazki : System.MarshalByRefObject

{

            private Hashtable ksiazki;

            public void DodajKsiazke(...)

            {

                        ...

            }

            public void Pozycz(...)

            {

                        ...

            }

            public void Oddaj(...)

            {

                        ...

            }

            ...

}

 

Dane dotyczące wybranej książki mogą być pobrane z całego zbioru dzięki indeksowi, który jest za razem kluczem głównym całego zbioru.

 

Program posiada także klasę Class1, która reprezentuje prosty konsolowy interfejs służący demonstracji działania i wykorzystania Bamboo Prevalence.

[Kod C#]

class Class1

{

            Ksiazki ksiazki;           

            public static void Main(string[] args)

            {

                        new Class1().Run();

            }

            public void Run()

            {

                        ...

            }

            private bool ObslugaMenu()

            {

                        ...

            }

            private void DodajKsiazke()

            {

                        ...

            }

            private void PozyczKsiazke()

            {

                        ...

            }

            private void OddajKsiazke()

            {

                        ...

            }

            private void PokazKsiazki()

            {

                        ...

            }

            private void PodkazKsiazkiDoPozyczenia()

            {

                        ...

            }

            private void PodkazKsiazkiDoOddania()

            {

                        ...

            }

}

Jeżeli stworzymy taką aplikację jak opisałem do tej pory, to po jej wyłączeniu wszystkie

dane zostaną utracone. Aby jednak dane były trwałe możemy w projekcie wykorzystać Bamboo Prevalence.

 

Wprowadzenie i wykorzystanie w naszej aplikacji Bamboo Prevalence.

 

Oczywiście, aby włączyć do projektu Bamboo Prevalence musimy dodać referencję do pliku Bamboo.Prevalence.dll, który możemy znaleźć w "Bamboo.Prevalence.1.4.2.zip" po rozpakowaniu w katalogu bin. Teraz musimy jeszcze dokonać niewielkich zmian w kodzie.

 

Definicje klas Ksiazka oraz Ksiazki muszą być poprzedzone atrybutem [Serializable] oraz klasa Ksiazki musi dziedziczyć po System.MarshalByRefObject. Są to zabiegi niezbędne, aby Bamboo Prevalence mogło serializować dane.

Pozostaje już tylko dokonać kilka zmian w klasie zarządzającej menu Class1. Zatem dodajemy do tej klasy atrybut engine typu PrevalenceEngine - dzięki tej zmiennej

będziemy mogli wykorzystać wszystko to, co daje nam Bamboo Prevalence. Jeszcze przed

definicją klasy Class1 powinniśmy dodać atrybut [TransparentPrevalence], dzięki któremu

obiekt engine będzie mógł automatycznie przechwytywać wszystkie wywołania funkcji i zapisywać w pliku commandlog informacje o zmianach w obiektach przechowywanych w aplikacji. Poniższy kod pokazuje jak inicjujemy zmienną engine w konstruktorze klasy Class1:

[Kod C#]

string prevalenceBase = Path.Combine(Environment.CurrentDirectory, "dane");

engine = PrevalenceActivator.CreateTransparentEngine(typeof(Ksiazki), prevalenceBase);

ksiazki = engine.PrevalentSystem as Ksiazki;

Jeżeli teraz uruchomimy naszą aplikację to wszystko będzie już działać poprawnie. Dane po

zrestartowaniu programu nie będą tracone. Ciągle jednak nie przechowujemy danych tylko trzymamy w pliku commandlog informację o kolejności wywołania funkcji i ich parametrach. Dzięki tym informacją dane są odtwarzane przy starcie programu. Zatem aby utrwalać nasze dane na dysku musimy jeszcze dodać do klasy Class1 poniższą metodę:

[Kod C#]

private void SystemSnapshot()

{

            WriteLine("Czekaj... ");

            engine.TakeSnapshot();

            WriteLine("Wykonane!");

}

Dzięki tej metodzie będziemy mogli w każdym momencie zapisać dane w plikach, dzięki czemu nie będą one na nowo odtwarzane za każdym razem przy starcie aplikacji, ale będą po prostu wczytywane z pliku binarnego.

Cały kod opisywanej tutaj aplikacji jest dołączony do artykułu jako plik Przykład.zip. 

 

Jeżeli ktoś chce przetestować systemem zbudowany w oparciu o Bamboo Prevalence  działającym online to zachęcam do odwiedzenia strony http://www.eggheadcafe.com/articles/ContactManagerWeb/default.aspx. Co prawda nie wiem kto stworzył ten system, ale mimo to odsyłam do niego tych, którzy zainteresują się Bamboo Prevalence.

 

Podsumowanie

 

Bamboo Prevalence (http://sourceforge.net/projects/bbooprevalence/) to opensourceowa implementacja w .NET Prevalence. Podstawową cechą Prevalence jest trzymanie wszystkich danych w pamięci, Prevalence posiada mechanizmy, które pozwalają przechowywać dane bez użycia SZRBD (System Zarządzania Relacyjną Bazą Danych), dlatego można twierdzić, że jest on pewnego rodzaju alternatywą dla SZRBD podczas tworzenia bazy danych. Kluczową cechą prezentowanej koncepcji jest to, że zamiast tworzenia relacyjnego modelu danych tworzymy obiekty. Po prostu tworzymy obiekty bez żadnych mapowań do lub z relacyjnych baz danych.

 

Podstawowe zalety:

ü      Bamboo Prevalence ma bardzo małe koszty wprowadzenia. Jest zarówno łatwy do nauczenia się jak również jest darmowy.

ü      Pozwala on nam projektować nasz model obiektowy bez zastanawiania się, w jaki sposób zamodelować nasz projekt w relacyjnej bazie danych.

 

Podstawowym celem Bamboo Prevalence jest zrezygnowanie z SZRBD i trzymanie wszystkich obiektów w pamięci. Praca z wszystkimi danymi znajdującymi się w pamięci pozwala na wyjątkowo szybki czas dostępu do danych, a model obiektowej reprezentacji danych jest prosty do zaprojektowania.

Załączniki:

Podobne artykuły

Komentarze 4

User 81862
User 81862
1 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0

Fajny art, taka ciekawostka wydlubana w sieci. No i w koncu cos o jakiejs free technologii przeszlo przez admina :) Moj art nie przeszedl dlatego, ze zawieral w tresci slowo "Linuks" :P

Aczkolwiek te liczby (ze 3000 razy szybsze to jest od MySQLa) to do mnie jakos nie przemawiaja. Moze dlatego ze chodzi o JDBC. A ktos porownywal predkosci przy dostepie przez jakis inny interfejs?

Z drugiej strony pamiec jest duzo szybsza. Tylko z drugiej strony zawalac pamiec jakimis tam obiekcikami.. Jesli serwer baz danych to osobna maszyna to pewnie jeszcze moze tak byc, ale jesli jest to serwer typu wszystko w jednym to nie wiem czy da sie z tym zyc. Aczkolwiek pomysl ciekawy, ciekawe czy przetrwa probe czasu.

mat_sk
mat_sk
0 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0

Cytuję: "Queries with Prevayler are more than 9000 times faster than querying Oracle through JDBC.
Queries with Prevayler are more than 3000 times faster than querying MySQL through JDBC.
"

źródło: http://www.prevayler.org/wiki.jsp

pozdrawiam autor

User 131335
User 131335
0 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0
JDBC? ;)
User 131335
User 131335
0 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0
Zaciekawiony artykułem Mateusza przejrzałem http://www.prevayler.org/wiki.jsp?topic=PrevalenceSkepticalFAQ. Idea naprawdę wydaje się bardzo ciekawa, szczególnie dla systemów wymagających krytycznie szybkiego dostępu do danych. Niezwykle wysoki stosunek Szybkość RAM/Szybkość HDD do niewielkiego stosunku Cena RAM/Cena HDD sprawia, że bliższe przyjrzenie się tej technologii wydaje się bardzo rozsądne. Gratulacje za wskazanie ciekawego materiału! Pozdrawiam.
pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.