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
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
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
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
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
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
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
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
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
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
Top Related