czwartek, 23 grudnia 2010

Db4o jak zacząć?


W tym poście opowiem jak zacząć swoją przygodę z db4o. Nie będę pisał kolejnego tutoriala na ten temat, gdyż zostało to już niejednokrotnie zrobione. Skupię się raczej na przygotowaniu środowiska, pokazaniu przydatnych narzędzi i odesłaniu do ciekawych artykułów. Zaczynajmy.

Chcąc się bawić z db4o musimy na początek wybrać wersję z której będziemy korzystać. Ja na co dzień korzystam z wersji 7.4 określanej jako Stable. Mamy jeszcze wersje 7.12 (określaną jako Production) i 8.0 (Development). Podstawowe funkcjonalności powinny być takie same, ale z tego co kojarzę to poszczególne wersje różnią się pewnymi bardziej zaawansowanymi mechanizmami.

Chcąc więc skorzystać z db4o należy podpiąć odpowiedniego JAR’a pod projekt. Możemy takowego bezpośrednio ściągnąć ze strony producenta: db4o for Java, version 7.4.155.14653 ZIP W tym pliku, katalogu lib mamy min. dostępne odpowiednie wersje JAR’ów przygotowane dla różnych wersji Javy:

  • db4o-7.4.155.14653-java1.1.jar
  • db4o-7.4.155.14653-java1.2.jar
  • db4o-7.4.155.14653-java5.jar

Ja oczywiście korzystam z wersji dla Javy 5. Jeżeli korzystamy z mavena, to musimy dodać następujący wpis:


  
    db4o
    http://source.db4o.com/maven/
  



  com.db4o
  db4o-java5
  7.4-SNAPSHOT


Teraz już możemy się bawić. Na początek polecam przejście tutoriala: doc\tutorial\db4o-7.4-tutorial.pdf z archiwum ściągniętego wraz z db4o. Pokazuje on za pomocą przykładów funkcjonalności db4o. Nie ma tu jakiś wielkich teorii jak całość działa, tylko raczej ukazanie funkcjonalności za pomocą przykładu i krótkiego komentarza. Budowana jest w nim aplikacja odnosząca się do wyścigów F1 i w kolejnych rozdziałach przedstawia kolejne dostępne funkcjonalności.

W tutorialu tym brakuje pokazanego kodu klasy Util. Musimy więc sami stworzyć sobie taką klasę w naszym projekcie, lub zastąpić wszelkie wywołania Util.DB4OFILENAME nazwą pliku w którym będzie przechowywana nasza baza danych. Ewentualnie skorzystać z kodu dostępnego w tym samym katalogu co tutorial.

Znalazłem nawet niemalże tłumaczenie tego tutoriala na polski. Fakt faktem nie dotyczy on najnowszej wersji, a jedynie 6.3. Kiedyś przeczytałem to całkiem dokładnie i było nie było to najgorsze tłumaczenie. Można się na nim opierać. Czasami są wywoływane w tym „tutorialu" metody, które są obecnie @deprecated, ale poza tym jest całkiem ok. Opisywane tłumaczenie jest zawarte w pracy magisterskiej Pawła Protasia pt. Pomost pomiędzy SBQL a Db4o.

Jeżeli chcielibyśmy stworzyć prostego CRUD’a z wykorzystaniem db4o i JSP polecam artykuł z 8mego numeru Java exPress  pt.: DB4O - Obiektowa baza danych. Autorem artykułu jest Paweł Cegła, który również na swoim blogu pisze o db4o.

To tyle na początek jeśli chodzi o chęć zrozumienia działania samej bazy db4o. Chcąc tworzyć już bardziej skomplikowane, wielowątkowe aplikacje, powinniśmy zapoznać się z klasą Db4oUtil. Pierwszy raz znalazłem ją na blogu Space Program we wpisie: Db4oUtil (aka. The Easiest Way to Get Started With Db4o). Kopia tej klasy (troszkę zmodyfikowana) znajduje się również na stronie db4o: Db4oUtil (aka. The Easiest Way to Get Started With Db4o). Podaje obydwa linki, gdyż jakiś czas temu strona db4o przechodziła renowacje i wówczas wiele linków nie działało.

Db4oUtil jest thread safe i proste w użyciu. Ja akurat zazwyczaj korzystam ze zmodyfikowanej przez mnie wersji tego pliku w zależności od aktualnych potrzeb projektowych. Schemat użytkowania jest podany w przytoczonych artykułach.

Mamy jeszcze do dyspozycji oczywiście dokumentację javadoc. Miejscami nie jest ona „wylewna”, ale na pewno warto ją podpiąć pod ulubione IDE. Jest jeszcze Reference Documentation (doc\reference\db4o-reference-java.pdf), ale to już jest ponad 1000 stron w pdf’ie i początkowo odradzam. Dopiero jak czegoś nie znajdziemy w tutorialu, ani w javadoc to można tego szukać w dokumentacji referencyjnej.

Na koniec chciałbym polecić narzędzie ObjectManagerEnterprise (OME). Jest to aplikacja służąca do podglądu bazy db4o (nawet jak nie wiemy jakie klasy tam siedzą). Narzędzie jest dystrybuowane razem z biblioteką db4o. Działa ono jako wtyczka do Visual Studio (w przypadku gdy korzystamy z wersji db4o dla C#) lub Eclipse (w przypadku gdy korzystamy z wersji Javowej). Jest jeszcze rozszerzenie dla Netbeans’a: db4o-netbeans, ale jest ono już nie rozwijane od 3ch lat i z nowym NB nie współpracuje (a szkoda).

OME wywodzi się bezpośrednio z projektu db4o Object Manager działającego jako aplikacja standalone. Jednak i ten projekt nie jest już rozwijany i nie wspiera nowszych wersji db4o.

Jeszcze mogę polecić własną prezentację pt.: Inicjatywa NoSQL na przykładzie db4o, którą miałem ostatnio okazję prezentować w ramach WrocJUG. Więcej o samej prezentacji w poprzednim wpisie: Wrażenia po pierwszej mojej prezentacji w ramach Wrocław Java User Group.

To chyba na tyle co mógłbym polecić na początek, jeśli ktoś chciałby się pobawić db4o. Wszelkie komentarze z interesującymi linkami na temat db4o mile widziane.

6 komentarzy:

  1. Witam serdecznie
    Mam mały problem z db4o i zastanawiam czy nie mógł byś mi pomóc.

    Tworze drzewo genealogiczne w db4o i mam klase Osoba zawierajaca np Imie Nazwisko i inny obiekt tej samej klasy: Matka.
    Nie potrafie zrobić tak, stworzyc nowa osobę, i zadeklarować jej jako atrybut Matka już istniejącą osobę w bazie.
    Przy użyciu new
    db.store(new osoba() { Imie = ".", Matka = new Osoba() { Imie = ".."}});
    Powstaje kolejna taka sama osoba jak Matka w bazie, czyli mam niepotrzebną replikacje.

    Pozdrawiam

    OdpowiedzUsuń
  2. Nie wiem czy dobrze zrozumiałem problem, ale aby 2ka dzieci miała tą samą matkę w bazie musisz to zrobić na mniej więcej tak:
    Osoba matka = new Osoba("Mama");
    Osoba dziecko1 = new Osoba("Jasiu");
    dziecko1.setMother(matka);
    Osoba dziecko2 = new Osoba("Stasiu");
    dziecko2.setMother(matka);

    i teraz zachowujesz dziecko 1 i 2:
    db.store(dziecko1);
    db.store(dziecko2);

    Teraz obydwoje dzieci mają referencję na tą samą matkę.
    Jak coś jest jeszcze nie jasne to pytaj!

    OdpowiedzUsuń
  3. a nie lepiej porobic dziedzicznie?

    class Osoba{}
    class Matka : Osoba { }
    class Dziecko : Osoba { private Matka matka; }

    i tworzysz sobie jedna matke:

    Matka matka=new Matka();
    i dzieci:
    Dziecko dziecko1=new Dziecko(matka=matka;);
    Dziecko dziecko2=new Dziecko(matka=matka;);

    Jak jakies pytanie , pytaj :)

    OdpowiedzUsuń
    Odpowiedzi
    1. > a nie lepiej porobic dziedzicznie?

      W twoim przypadku dziedziczenie jest nieuzasadnione, chyba że twoja domena problemu mówi, że Matka i dziecko są od siebie odmienne. W twoim przypadku oznacza to, że dziecko nie może być matką, i drzewo gealogiczne ma głębokość 2.

      Usuń
    2. no tak....
      ale czy robiac dzrewo genealogiczne nie patrzysz na nie z 'wlasnej perspektywy' tzn opisujesz je: moj dziadek ,babcia , mama , prarparpadziadaek itp?
      w razie konieczosci dalszej rozbudowy dopisujesz nowe klasy dziedziczace po osobie.

      Usuń
    3. Ta twoja 'własna perspektywa', to jest to pewne wymaganie, które kusi aby wziąć twoje rozwiązanie. Co jednak, gdy będziesz chciał zmienić perspektywę, aby pokazać twoje ładne drzewo genealogiczne swojej babci? Co ci da to, że to będą osobne klasy? Nie znam dziedziny całego problemu który modelujesz, ale na czuja dziedzicznie javowe, nie jest tym co czujemy jako dziedziczenie genów.

      Proponowałbym jeszcze raz przerobić teorię dziedziczenia i polimorfizmu, bo na siłę próbujesz je zastosować tam, gdzie Ci ono kompletnie nie jest potrzebne.

      Usuń