2011-05-13 11 views
9

Używam dwóch różnych sposobów kwerendy obiektów w db4o i chciałbym dyskutować na ten temat.Najlepsze praktyki db4o do zapytania obiektów z db

1) W tym pierwszym przykładzie tworzę instancję ObjectContainer, otwieram połączenie, a następnie je zamykam.

ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "User"); 
ObjectSet result = db.queryByExample(user); 
db.close(); 

2) W tym drugim przykładzie tworzę ObjectServer i niech połączenie otwarte przez cały cykl życia aplikacji. Ja również otwarty ObjectContainer z ObjectServer, aby moje zapytanie, a następnie zamknij go:

ObjectServer userDb = Db4oClientServer.openServer(Db4oClientServer.newServerConfiguration(), "User", 0); 
ObjectContainer client = client = userDb.openClient(); 
ObjectSet result = client.queryByExample(user); 
client.close(); 

-

Jakie są główne różnice między obiema metodami? Czy to niebezpieczne, jeśli nigdy nie zamykam serwera ObjectServer?

Moim zdaniem druga metoda jest lepsza, ponieważ jeśli dwie różne instancje wywołają metodę pokazaną w pierwszym przykładzie, drugi wywołujący otrzyma wyjątek, ponieważ baza danych zostanie zablokowana, ale w drugim przykładzie robię nie ma takiego problemu. Ponieważ nie mam dużego doświadczenia z db4o, wolę zapytać, czy jestem na dobrej drodze.

Odpowiedz

11

db4o działa najlepiej, gdy połączenie pozostaje otwarte przez cały cykl życia aplikacji.

Po pobraniu obiektu, zamknięciu bazy danych, ponownym otwarciu i ponownym zapisaniu obiektu, db4o nie zda sobie sprawy, że obiekt jest już zapisany (od czasu zamknięcia połączenia, a także od systemu odniesienia db4o) i zapisze drugie wystąpienie .

Inną kwestią (jeśli uruchomisz db4o w trybie wbudowanym) jest to, że otwieranie bazy danych jest czasochłonną operacją, więc jeśli będziesz nadal otwierać/zamykać bazę danych z pewnością wystąpią problemy z wydajnością (z drugiej strony, otwarcie klienta połączenia nie są tak kosztowne i dlatego nie powinny stanowić problemu).

+0

Wow, dzięki. Miałem problem, że moje obiekty były przechowywane dwa razy, i nie wiedziałem dlaczego. Twoja odpowiedź sprawia, że ​​ta kwestia jest dla mnie jasna. Wielkie dzięki Vagaus. – jcdmb

+0

Vagaus Hej, właśnie widziałem, że u jest brazylijski :) Kończę mój kurs nauki w informatyce = KIT Karlsruhe Institute of Technology w Niemczech. Byłem przez jakiś czas chce wiedzieć ktoś w okolicy dać mi jakieś informacje o tym, jak rynek pracy w dziedzinie informatyki w Brazylii, będzie to, że możemy wymienić kilka małych pomysłów w tym kierunku? Wyślij do mnie e-maila na mój adres e-mail miarę możliwości prosimy: [email protected] Z góry dziękuję za współpracę. Uścisk! – jcdmb

+0

Mam pytanie, w jaki sposób sprawdzić, czy db4o ObjectContainer jest zamknięta? –

4

W pierwszym próbce kodu otwierasz bazę danych db4o za pomocą trybu wbudowanego, w zasadzie otrzymujesz kontener obiektu lokalnego i pracujesz nad jedną transakcją aż do zamknięcia bazy danych.

W drugiej przykładowej instancji tworzony jest serwer obiektów. Istnieją dwa tryby pracy z serwerami obiektowymi: tryb lokalny (gdy wybierzesz numer portu 0, to zrobiłeś) i tryb zdalny (wybierz host i port wyższy niż 0). Ten pierwszy nie wiąże się z siecią, podczas gdy późniejszy (i działa zdalnie (aka C/S)).

W każdym razie, zaletą pracy z serwerem obiektowym jest to, że dostajesz wiele transakcji poprzez otwarcie kontenerów obiektów klienta (openClient()), kiedy otwierasz nowego klienta, otrzymujesz nowy kontener obiektów z własnym systemem odniesienia i niezależnym commit/rollback (jak nowa transakcja).

Zwykle wybierzesz drugą próbkę, jeśli będziesz pracować z wieloma klientami działającymi na tym samym serwerze obiektów i potrzebujesz separacji transakcji.

Więcej informacji: http://developer.db4o.com/Documentation/Reference/db4o-8.0/java/reference/index_CSH.html#client-server.htm

Best!

+0

Danke Schön for die Erklärung ausführliche;) – jcdmb