inicjatywa nosql na przykładzie db4o

73
Inicjatywa NoSQL na przykladzie db4o. Marcin Stachniuk [email protected] http://mstachniuk.blogspot.com 14 grudnia 2010 Dziękuję za uwagę! Marcin Stachniuk Inicjatywa NoSQL na przykladzie db4o. 1/59

Upload: marcinstachniuk

Post on 21-Jan-2018

551 views

Category:

Technology


1 download

TRANSCRIPT

Inicjatywa NoSQL na przykładzie db4o.

Marcin [email protected]

http://mstachniuk.blogspot.com

14 grudnia 2010

Dziękuję za uwagę!

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 1/59

WARNING!

kontrowersyjny / „śliski” temat

mimo wszystko zachęcam do dyskusji :)

Tak to się zaczęło...

Edgar Frank Codd

A Relational Model of Data for Large Shared Data Banks, 1970

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 3/59

...a to było później

1972 Pojawienie się Smalltalk’a

1979 Pojawienie się Oracle’a, pierwszej relacyjnej, komercyjnej bazydanych

1979 Pojawienie się C++

1980 Pojawienie się Smalltalk-80

1995 Pojawienie się Javy

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 4/59

Model relacyjny i obiektowy

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 5/59

Model relacyjny i obiektowy

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 6/59

Niezgodność typów danych

Model relacyjny Model obiektowyVARCHAR2(size),NVARCHAR2(size),CHAR(size),NCHAR(size)

java.lang.String

NUMBER(5) shortNUMBER(10) intNUMBER(19) longLONG ResultSet.getBinaryStream()NUMBER doubleDATE java.sql.TimestampTIMESTAMP oracle.sql.TIMESTAMP

Na przykładzie Oracle 10g

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 7/59

SQL Injection

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 8/59

co jeszcze...

Są głosy (H.Baker), że model relacyjny opóźnił rozwój przemysłu bazdanych o 10 lat.1

Można skonstruować kompletny język zapytań/programowania opartywyłącznie o algebrę relacji. Tę demagogię propaguje utwór „The ThirdManifesto” H.Darwena i C.J.Date.2

SQL jest oparty na logice matematycznej. Przekręt w wykonaniuJ. Ullmana.2

W odróżnieniu od systemów obiektowych, systemy relacyjne i SQLposiadają solidne podstawy matematyczne. Nieprawda. [...] SQLposiada wiele operatorów nie rozpatrywanych przez relacyjne teorie,np. operatory aktualizacyjne, uporządkowanie [...]2

1Słownik terminów z zakresu obiektowości, Kazimierz Subieta2Obiektowe Bazy Danych kontra Relacyjne Bazy Danych, Kazimierz Subieta

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 9/59

co jeszcze...

Są głosy (H.Baker), że model relacyjny opóźnił rozwój przemysłu bazdanych o 10 lat.1

Można skonstruować kompletny język zapytań/programowania opartywyłącznie o algebrę relacji. Tę demagogię propaguje utwór „The ThirdManifesto” H.Darwena i C.J.Date.2

SQL jest oparty na logice matematycznej. Przekręt w wykonaniuJ. Ullmana.2

W odróżnieniu od systemów obiektowych, systemy relacyjne i SQLposiadają solidne podstawy matematyczne. Nieprawda. [...] SQLposiada wiele operatorów nie rozpatrywanych przez relacyjne teorie,np. operatory aktualizacyjne, uporządkowanie [...]2

1Słownik terminów z zakresu obiektowości, Kazimierz Subieta2Obiektowe Bazy Danych kontra Relacyjne Bazy Danych, Kazimierz Subieta

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 9/59

co jeszcze...

Są głosy (H.Baker), że model relacyjny opóźnił rozwój przemysłu bazdanych o 10 lat.1

Można skonstruować kompletny język zapytań/programowania opartywyłącznie o algebrę relacji. Tę demagogię propaguje utwór „The ThirdManifesto” H.Darwena i C.J.Date.2

SQL jest oparty na logice matematycznej. Przekręt w wykonaniuJ. Ullmana.2

W odróżnieniu od systemów obiektowych, systemy relacyjne i SQLposiadają solidne podstawy matematyczne. Nieprawda. [...] SQLposiada wiele operatorów nie rozpatrywanych przez relacyjne teorie,np. operatory aktualizacyjne, uporządkowanie [...]2

1Słownik terminów z zakresu obiektowości, Kazimierz Subieta2Obiektowe Bazy Danych kontra Relacyjne Bazy Danych, Kazimierz Subieta

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 9/59

co jeszcze...

Są głosy (H.Baker), że model relacyjny opóźnił rozwój przemysłu bazdanych o 10 lat.1

Można skonstruować kompletny język zapytań/programowania opartywyłącznie o algebrę relacji. Tę demagogię propaguje utwór „The ThirdManifesto” H.Darwena i C.J.Date.2

SQL jest oparty na logice matematycznej. Przekręt w wykonaniuJ. Ullmana.2

W odróżnieniu od systemów obiektowych, systemy relacyjne i SQLposiadają solidne podstawy matematyczne. Nieprawda. [...] SQLposiada wiele operatorów nie rozpatrywanych przez relacyjne teorie,np. operatory aktualizacyjne, uporządkowanie [...]2

1Słownik terminów z zakresu obiektowości, Kazimierz Subieta2Obiektowe Bazy Danych kontra Relacyjne Bazy Danych, Kazimierz Subieta

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 9/59

co jeszcze...

Systemy relacyjne umożliwiającą matematyczną weryfikacjępoprawności zaprojektowanej bazy danych. Nie umożliwiają. [...]Pojęcia takie jak 2NF, 3NF, 4NF, BCNF oraz związane z nimi teorie[...] służą prawie wyłącznie jako pseudo-naukowy muł zapychającyprogramy nauczania i podręczniki dla studentów. Projektantinstynktownie unika sytuacji, które nie są zgodne z 3NF, 4NF, itd...3

Standard SQL-92 zapewnia pełną przenaszalność oprogramowaniapomiędzy różnymi systemami relacyjnych baz danych. Nie zapewnia.Są opinie, że ponad 95% programów zgodnych z SQL-92 nie jestprzenaszalna.3

jeszcze by się coś znalazło...

3Obiektowe Bazy Danych kontra Relacyjne Bazy Danych, Kazimierz SubietaMarcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 10/59

co jeszcze...

Systemy relacyjne umożliwiającą matematyczną weryfikacjępoprawności zaprojektowanej bazy danych. Nie umożliwiają. [...]Pojęcia takie jak 2NF, 3NF, 4NF, BCNF oraz związane z nimi teorie[...] służą prawie wyłącznie jako pseudo-naukowy muł zapychającyprogramy nauczania i podręczniki dla studentów. Projektantinstynktownie unika sytuacji, które nie są zgodne z 3NF, 4NF, itd...3

Standard SQL-92 zapewnia pełną przenaszalność oprogramowaniapomiędzy różnymi systemami relacyjnych baz danych. Nie zapewnia.Są opinie, że ponad 95% programów zgodnych z SQL-92 nie jestprzenaszalna.3

jeszcze by się coś znalazło...

3Obiektowe Bazy Danych kontra Relacyjne Bazy Danych, Kazimierz SubietaMarcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 10/59

co jeszcze...

Systemy relacyjne umożliwiającą matematyczną weryfikacjępoprawności zaprojektowanej bazy danych. Nie umożliwiają. [...]Pojęcia takie jak 2NF, 3NF, 4NF, BCNF oraz związane z nimi teorie[...] służą prawie wyłącznie jako pseudo-naukowy muł zapychającyprogramy nauczania i podręczniki dla studentów. Projektantinstynktownie unika sytuacji, które nie są zgodne z 3NF, 4NF, itd...3

Standard SQL-92 zapewnia pełną przenaszalność oprogramowaniapomiędzy różnymi systemami relacyjnych baz danych. Nie zapewnia.Są opinie, że ponad 95% programów zgodnych z SQL-92 nie jestprzenaszalna.3

jeszcze by się coś znalazło...

3Obiektowe Bazy Danych kontra Relacyjne Bazy Danych, Kazimierz SubietaMarcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 10/59

Rozwiązanie

W odpowiedzi na niedoskonałość relacyjnych baz danych powstałainicjatywa:

NoSQLpromująca rozwiazania bazodanowe, niewykorzystujące SQL’a.

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 11/59

Not only SQL

Not only SQL

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 12/59

Rozwiązania NoSQL

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 13/59

NoSQL w praktyce

Kto używa NoSQL:

Twitter (Hadoop / HBase, FlockDB, Cassandra, Pig)

Facebook (Cassandra)

Google (BigTable)

Digg.com (Cassandra)

SourceForge.net (MongoDB)

LinkedIn (Project Voldemort)

Amazon (Dynamo)

Subversion (BerkleyDB)

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 14/59

db4o

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 15/59

Charakterystyka db4o

Czym jest db4o?

Obiektowa baza danych open-source

Trzy licencje: darmowe (GPL4, dOCL5) i komercyjna6

Natywna implementacja dla języków Java i .NET

Duża społeczność (60000 zarejestrowanych developerów)

Ponad milion ściągnięć

4GNU General Public License5db4o Opensource Compatibility License (dOCL)6Commercial Packages and Prices

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 16/59

Charakterystyka db4o

Firmy korzystające z db4o:

BMW BoeingBosch IBMIntel RicohSeagate INDRA SistemasMerrill Lynch PostbankMacrix Software Mandala ITEastern Data Riege Software InternationalDie Mobilanten ITAnyplacePragmatyxs ElectrabelJuvander TradeWeaponLong Island Housing Services MR ControlsNovator Clarity MedicalSyft Technologies Arum Systems

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 17/59

Charakterystyka db4o

Dla kogo db4o?

Małe i średnie projekty (studenckie projekty!!!)

Nowe niskobudżetowe projekty

Gdzie nie ma narzuconej technologii wykorzystywanej bazy danych

Baza może działać na pliku dyskowym (podobnie jak: SQLite)

Brak konieczności stawiania osobnego serwera bazodanowego(ale oczywiście można)

Świetnie się nadaje do aplikacji typu standalone

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 18/59

Wersje db4o

Dostępne wersje db4o:

7.4 – Stable Recommended for product shipment

7.12 – Production Recommended for development with db4o

8.0 – Development Beta release, Ideal for testing new features

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 19/59

Jak zacząć?

Podpiąć JAR’a pod projekt:

OR

1: < r e p o s i t o r i e s>2: < r e p o s i t o r y>3: < i d>db4o</ i d>4: <u r l>h t t p : // sou r c e . db4o . com/maven/</ u r l>5: </ r e p o s i t o r y>6: </ r e p o s i t o r i e s>7:8: <dependency>9: <g roup Id>com . db4o</ g roup Id>10: <a r t i f a c t I d>db4o−j a va5</ a r t i f a c t I d>11: <v e r s i o n>7.4−SNAPSHOT</ v e r s i o n>12: </ dependency>

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 20/59

A co się jeszcze przyda?

ObjectManager Enterprise (OME)

Object Manager

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 21/59

Przykład

Czas na przykład

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 22/59

Diagram klas

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 23/59

INSERT INTO ... VALUES ...

1: Ob j e c tCon ta i n e r db = Db4o . o p enF i l e ( ” base . yap” ) ;2: db . s t o r e ( new Book ( . . . ) ) ;3: db . c l o s e ( ) ;

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 24/59

Właściwości metody store()

Właściwości metody store():

Zapisuje graf obiektow w bazie

Wykonywana jako jedna transakcja

Pozwala zapisać dwa „takie same” obiekty (!!!)

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 25/59

SELECT * FROM ...

1: Ob j e c tCon ta i n e r db = Db4o . o p enF i l e ( ” base . yap” ) ;2: ObjectSet<Book> books = db . query (Book . c l a s s ) ;3: f o r (Book book : books ) {4: System . out . p r i n t l n ( ”Odczytano : ” + book ) ;5: }6: db . c l o s e ( ) ;

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 26/59

UPDATE ... SET ...

Modyfikację obiektu wykonujemy za pomocą znanej już metody store():

1: Ob j e c tCon ta i n e r db = Db4o . o p enF i l e ( ” base . yap” ) ;2: ObjectSet<Book> books = db . query (Book . c l a s s ) ;3: f o r (Book book : books ) {4: book . setNumberOfPages (1000) ;5: db . s t o r e ( book ) ;6: }7: db . c l o s e ( ) ;

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 27/59

Cykl życia obiektów

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 28/59

Cykl życia obiektów

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 29/59

Cykl życia obiektów

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 30/59

Cykl życia obiektów

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 31/59

Cykl życia obiektów

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 32/59

Cykl życia obiektów

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 33/59

DELETE FROM ... WHERE ...

1: Ob j e c tCon ta i n e r db = Db4o . o p enF i l e ( ” base . yap” ) ;2: ObjectSet<Book> books = db . query (Book . c l a s s ) ;3: f o r (Book book : books ) {4: db . d e l e t e ( book ) ;5: }6: db . c l o s e ( ) ;

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 34/59

Aktualizacja usuwanych obiektów

TIP!Gdy usuwamy / aktualizujemy obiekty z ObjectSet, to aby zaktualizowaćzbiór, trzeba ponownie wykonać zapytanie, w celu aktualizacji zbioruobiektów.

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 35/59

Komplikacje

Problemy:

Zamknięcie połączenia powoduje utratę „skojarzenia” obiektów

Ciągłe otwieranie i zamykanie pliku jest kosztowne czasowo

Przechowywanie nazwy pliku z bazą w wielu miejscach nie jestdobrym rozwiązaniem (zasada DRY)

W danym czasie może być nawiązane jedno połączenie z plikiem(w trybie pracy na pliku)

Rozwiązanie: utrzymywać połączenie / pulę połączeńzastosować Db4oUtil78

7Db4oUtil (aka. The Easiest Way to Get Started With Db4o)http://developer.db4o.com/Projects/useful_snippets/db4outil_aka._the_easiest_way_to_get_started_with_db4o.html8http://www.spaceprogram.com/knowledge/2006/07/

db4outil-aka-easiest-way-to-get.htmlMarcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 36/59

Komplikacje

Problemy:

Zamknięcie połączenia powoduje utratę „skojarzenia” obiektów

Ciągłe otwieranie i zamykanie pliku jest kosztowne czasowo

Przechowywanie nazwy pliku z bazą w wielu miejscach nie jestdobrym rozwiązaniem (zasada DRY)

W danym czasie może być nawiązane jedno połączenie z plikiem(w trybie pracy na pliku)

Rozwiązanie: utrzymywać połączenie / pulę połączeńzastosować Db4oUtil78

7Db4oUtil (aka. The Easiest Way to Get Started With Db4o)http://developer.db4o.com/Projects/useful_snippets/db4outil_aka._the_easiest_way_to_get_started_with_db4o.html8http://www.spaceprogram.com/knowledge/2006/07/

db4outil-aka-easiest-way-to-get.htmlMarcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 36/59

Użycie Db4oUtil.java

Schemat postępowania z Db4oUtil.java:

1: // u s t aw i e n i e nazwy p l i k u2: Db4oUt i l . s e tDataba seF i l ename ( ”baza . yap” ) ;3:4: // pob r an i e ob i e k t u Ob j e c tCon ta i n e r5: Ob j e c tCon ta i n e r db = Db4oUt i l . g e tOb j e c tCon t a i n e r ( ) ;6:7: // Ko l e j n e o p e r a c j e . . .8:9: // Zamkn ięc i e Ob j e c tCon ta i n e r gdy kon i e c o p e r a c j i10: Db4oUt i l . c l o s eOb j e c tCon t a i n e r ( ) ;11:12: // zamkn i e c i e wszy s t k i ego , p r zy kończen iu a p l i k a c j i13: Db4oUt i l . shutdown ( ) ;

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 37/59

SELECT * FROM ... WHERE ...

Zapytania poprzez Query By Example:

Tworzymy obiekt który będzie przykładem tego co mamy znaleźć

Ustawione pola są dopasowywane „dokładnie”

Dla pól z wartością domyślną wszystko pasuje

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 38/59

SELECT * FROM ... WHERE ...

Poszukajmy książek mających 500 stron:

1: Ob j e c tCon ta i n e r db = Db4oUt i l . g e tOb j e c tCon t a i n e r ( ) ;2: Book exampleBook = new Book ( nu l l , n u l l , 500) ;3: ObjectSet<Book> books = db . queryByExample ( exampleBook ) ;4: f o r (Book book : books ) {5: System . out . p r i n t l n ( ” Zna l e z i ono : ” + book ) ;6: }

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 39/59

SELECT * FROM ... WHERE ...

Zapytania poprzez Native Queries:

Rozszerzamy klasę com.db4o.query.Predicate<ExtentType>

Przeciążamy metodę: public boolean match(ExtentType et)

Wywołujemy: db.query(Predicate predicate);

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 40/59

SELECT * FROM ... WHERE ...

Poszukajmy książek Kenta Beck’a lub mające 700 stron.„Normalnie” (czytaj w SQL’u9) by było to jakoś tak:

1: SELECT ”Book” . ” ID” , ” t i t l e ” , ”numberOfPages” , ” author ID ”2: FROM ”Book” LEFT OUTER JOIN ”Author ” ON3: ”Book” . ” author ID ” = ”Author ” . ” ID”4: WHERE ( ”name”=’ Kent ’ AND ”surname”=’ Beck ’ )5: OR ”numberOfPages”=700

9Oracle 10 XEMarcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 41/59

SELECT * FROM ... WHERE ...

Poszukajmy książek Kenta Beck’a lub mające 700 stron.W db4o będzie to tak:

1: f i n a l S t r i n g name = ”Kent” ;2: f i n a l S t r i n g surname = ”Beck” ;3:4: Ob j e c tCon ta i n e r db = Db4oUt i l . g e tOb j e c tCon t a i n e r ( ) ;5:6: ObjectSet<Book> books = db . query ( new Pred i c a t e<Book>() {7:8: @Over r ide9: p u b l i c boo l ean match (Book book ) {10: i f ( ( book . getAuthor ( ) . getName ( ) . e qu a l s ( name) &&11: ( book . getAuthor ( ) . getSurname ( ) . e qu a l s (12: surname ) ) ) | |13: book . getNumberOfPages ( ) == 700)14: r e t u r n t r u e ;15: r e t u r n f a l s e ;16: }17: }) ;

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 42/59

SELECT * FROM ... WHERE ...

Niby działa, ale ubezpieczmy się na wartość null:

1: ObjectSet<Book> books = db . query ( new Pred i c a t e<Book>() {2:3: @Over r ide4: p u b l i c boo l ean match (Book book ) {5: i f ( ( book . getAuthor ( ) . getName ( ) != n u l l &&6: book . getAuthor ( ) . getName ( ) . e qu a l s ( name ) &&7: ( book . getAuthor ( ) . getSurname ( ) != n u l l &&8: book . getAuthor ( ) . getSurname ( ) . e qu a l s (9: surname ) ) ) | |10: book . getNumberOfPages ( ) == 700)11: r e t u r n t r u e ;12: r e t u r n f a l s e ;13: }14: }) ;

Linie 5 i 7

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 43/59

SELECT * FROM ... WHERE ... ORDER BY ...

Sortowanie wyników przy Native Queries:

Implementujemy Comparator<T>

Wywołujemy: db.query(Predicate predicate, Comparatorcomparator)

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 44/59

SELECT * FROM ... WHERE ... ORDER BY ...

Kod komparatora:

1: p u b l i c c l a s s BooksT i t l eComparato r2: implements Comparator<Book> {3:4: p u b l i c i n t compare (Book b1 , Book b2 ) {5: r e t u r n b1 . g e t T i t l e ( ) . compareToIgnoreCase (6: b2 . g e t T i t l e ( ) ) ;7: }8:9: }

Wywołanie:

1: ObjectSet<Book> books = db . query ( new Pred i c a t e<Book>() { . . . } ,2: new BooksT i t l eComparato r ( ) ) ;

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 45/59

Zapytania SODA

Zapytania SODA:

Niskopoziomowe zapytania db4o

Budowa drzewiasta

Idealne do dynamicznego budowania zapytań

Szybsze niż Native Queries

Brak kontroli typów (w przeciwieństwie do NQ)

Nie trzeba się martwić o null

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 46/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

SODA Simple Object Data Access

Class: Book

author

name

Equals: Kent

and

surname

Equals: Beck

or

numberOfPages

Equals: 700

query.constrain(Book.class);Constraint pagesConstraint =query.descend(”numberOfPages”).constrain(700);Constraint surnameConstraint = query.descend(”author”)

.descend(”surname”).constrain(”Beck”);query.descend(”author”).descend(”name”).constrain(”Kent”)

.and(surnameConstraint).or(pagesConstraint);Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 47/59

Tryb pracy klient serwer

Tryb pracy na pliku Tryb pracy klient serwer

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 48/59

Tryb pracy klient serwer

Uruchomienie serwera (klasa StartServer):

1: Ob j e c tS e r v e r db4oSe rve r = Db4o . openSe rve r ( FILE , PORT) ;2: db4oSe rve r . g r an tAcce s s (USER, PASS) ;3:4: // u s t aw i e n i e na s łuch iwacza ob iektów5: db4oSe rve r . e x t ( ) . c o n f i g u r e ( ) . c l i e n t S e r v e r ( ) .←↩

s e tMe s s a g eRe c i p i e n t ( t h i s ) ;6:7: t r y {8: i f ( ! s top ) {9: // wa i t f o r e v e r f o r n o t i f y ( ) from c l o s e ( )10: t h i s . wa i t ( Long .MAX VALUE) ;11: }12: } ca tch ( Excep t i on e ) {13: e . p r i n t S t a c kT r a c e ( ) ;14: }15: db4oSe rve r . c l o s e ( ) ;

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 49/59

Tryb pracy klient serwer

Zatrzymanie serwera (wysłanie obiektu do serwera):

1: p u b l i c c l a s s S topSe r v e r {2: // . . .3:4: db = Db4oUt i l . g e tOb j e c tCon t a i n e r ( ) ;5:6: // get the messageSender f o r the Ob j e c tCon ta i n e r7: MessageSender messageSender = db . e x t ( ) . c o n f i g u r e ( ) .8: c l i e n t S e r v e r ( ) . getMessageSender ( ) ;9:10: // send an i n s t a n c e o f a S topSe r v e r o b j e c t11: messageSender . send ( new StopSe r v e r ( ) ) ;12:13: // . . .14: }

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 50/59

Tryb pracy klient serwer

Zatrzymanie serwera (odebranie obiektu od klienta):

1: p u b l i c c l a s s S t a r t S e r v e r implements Mes sageRec i p i en t {2: // . . .3:4: // Imp lementac ja metody z Mes sageRec i p i en t5: p u b l i c vo i d p roce s sMessage ( MessageContext con ,6: Object message ) {7: i f ( message i n s t a n c e o f S topSe r v e r ) {8: c l o s e ( ) ;9: }10: }11: }

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 51/59

Tryb pracy klient serwer

Użycie serwera (modyfikacja Db4oUtil):

1: oc = Db4o . op enC l i e n t (HOST, PORT, USER, PASS) ;

Reszta taka sama :)

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 52/59

Transakcje

Transakcje:

ACID

Read committed

Domyślnie każda operacja jest pojedyńczą transakcją

Ale mamy metody commit() i rollback() :)

W przypadku wywołania rollback() należy odświeżyć „żyweobiekty”:db.ext().refresh(author, Integer.MAX VALUE);

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 53/59

Android & db4o

Ale dla db4o > 7.4

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 54/59

Co dalej?

Co jeszcze nie zostało powiedziane:

Konfigurowanie połaczenia

Dziedziczenie, kolekcje, tablice

Kaskadowe wstawianie / modyfikacja / usuwanie

Głębokość aktywacji

Transprentna aktywacja

Pobieranie metadanych

Indeksowanie pól klas

Możliwość przechowywania obiektów typu BLOB

Możliwość replikacji bazy

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 55/59

Więcej informacji

Strona projektu

Developer Community

db4objects and the Dual Licensing Model

Object Manager 7.4

db4o-netbeans

db4o Tutorial for Java

Db4oUtil (aka. The Easiest Way to Get Started With Db4o)http://developer.db4o.com/Projects/useful_snippets/db4outil_aka._the_easiest_way_to_get_started_with_db4o.htmlhttp://www.spaceprogram.com/knowledge/2006/07/db4outil-aka-easiest-way-to-get.html

Using db4o in an Android application

MapMe (aplikacja na androida wykorzystujaca db4o)

Słownik terminów z zakresu obiektowości, Kaziemierz Subieta

Obiektowe Bazy Danych kontra Relacyjne Bazy Danych, Kazimierz Subieta

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 56/59

Pytania

Pytania?

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 57/59

Pewnie ktoś się zapytał o wydajność...

Barcelona Benchmarks – wydajność transakcji, pobierającej 100 obiektówz puli 30000 rekordów z 5cio stopniową strukturą dziedziczenia

Barcelona Benchmarks read write query deleteNative / db4o 6.4 1,0 1,0 1,0 1,0Hibernate / hsqldb 15,8 3,7 2583,1 4,3Hibernate / mysql 48,0 26,1 14,4 26,9JDBC / MySQL 40,8 19,5 9,3 15,8JDBC / JavaDB 27843,7 20,5 47993,1 17,7JDBC / HSQLDB* 1,9 1,1 2554,4 0,5JDBC / SQLite 8,8 519,1 1,1 362,1

fastest slowest

*JDBC / HSQLDB not ACID transaction safehttp://developer.db4o.com/LearnMore/RealTimePerformance.aspx

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 58/59

Inicjatywa NoSQL na przykładzie db4o.

Marcin [email protected]

http://mstachniuk.blogspot.com

14 grudnia 2010

Dziękuję za uwagę!

Marcin Stachniuk Inicjatywa NoSQL na przykładzie db4o. 59/59