db4o лучшая практика для запроса объектов из db - PullRequest
9 голосов
/ 13 мая 2011

Я использую два разных способа запроса объектов в db4o, и я хотел бы обсудить это.

1) В этом первом примере я создаю экземпляр ObjectContainer, открываю соединение и затем закрываю его.

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

2) Во втором примере я создаю ObjectServer и открываю соединение в течение всего жизненного цикла приложения. Я также открываю ObjectContainer из ObjectServer, делаю запрос и затем закрываю его:

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

-

В чем основное различие между обоими методами? Это опасно, если я никогда не закрою ObjectServer?

По моему мнению, второй метод лучше, потому что если два разных экземпляра вызывают метод, показанный в первом примере, второй вызывающий вызов получит исключение, потому что база данных будет заблокирована, но во втором примере я не есть такая проблема. Поскольку у меня нет большого опыта работы с db4o, я предпочитаю спросить, нахожусь ли я на правильном пути.

Ответы [ 2 ]

11 голосов
/ 14 мая 2011

db4o работает лучше всего, когда вы держите соединение открытым в течение всего жизненного цикла приложения.

Если вы извлекаете объект, закрываете базу данных, снова открываете ее и сохраняете объект снова. Db4o не поймет, что объект уже сохранен (так как вы закрыли соединение и откуда также справочная система db4o), и сохранитВторой экземпляр.

Другая проблема (если вы запускаете db4o во встроенном режиме) заключается в том, что открытие базы данных является трудоемкой операцией, поэтому, если вы продолжаете открывать / закрывать базу данных, безусловно, будут проблемы с производительностью (со стороныс другой стороны, открытие клиентских подключений не так дорого и поэтому не должно представлять никаких проблем).

4 голосов
/ 16 мая 2011

В первом примере кода вы открываете базу данных db4o, используя встроенный режим, в основном вы получаете контейнер локальных объектов и работаете над одной транзакцией, пока не закроете базу данных.

Во втором примере вы создаете объектный сервер. Существует два режима работы с объектными серверами: локальный режим (когда вы выбираете порт 0, это то, что вы сделали) и удаленный режим (выберите хост и порт выше 0). Первый не требует подключения к сети, а второй - (и может работать удаленно (он же C / S)).

В любом случае, преимущество работы с объектным сервером состоит в том, что вы получаете несколько транзакций через открытие клиентских контейнеров объектов (openClient ()), когда вы открываете новый клиент, вы получаете новый контейнер объектов с его собственной системой ссылок и независимой фиксацией. / откат (как новая транзакция).

Таким образом, вы обычно будете использовать второй пример, если вы будете работать с несколькими клиентами, работающими на одном объектном сервере, и вам нужно разделить транзакции.

Дополнительная информация: http://developer.db4o.com/Documentation/Reference/db4o-8.0/java/reference/index_CSH.html#client-server.htm

Best!

...