Клиент db4o видит изменения от другого клиента - PullRequest
0 голосов
/ 10 декабря 2011

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

1: вызовите функцию Refresh () для объекта (из http://www.gamlor.info/wordpress/2009/11/db4o-client-server-and-concurrency/):

const int активацииDeph = 4;

client2.Ext (). Refresh (objFromClient2, активацииDeph);

2: Вместо кэширования IObjectContainer откройте новый IObjectContainer для каждого запроса БД.

Isда?

Да, # 1 более эффективен, но реально ли указать, какие объекты обновлять? Я имею в виду, что когда БД задействована, каждый раз, когда клиент обращается к ней, он должен получить последнюю версию.информация. Вот почему я склоняюсь к № 2. Кроме того, у меня нет серьезных проблем с эффективностью.

Итак, я прав, что это два подхода? Или есть другой?

И, подождите секунду ... что происходит, когда ваш объект выходит из области видимости? По таймеру я вызываю метод, который получает объект с сервера БД. Этот метод создает объект. Поскольку объект вышел из области видимостиэто не там, чтобы обновитьчасИ когда я вызываю БД, я не вижу изменений от клиента.В этом случае кажется, что единственный вариант - открыть новый IObjectContainer.Нет?

** Редактировать **

Я думал, что выложу некоторый код, используя решение, которое, наконец, решил использовать.Поскольку при использовании нового IObjectContainer для каждого вызова были некоторые серьезные сложности, я просто собираюсь делать Refresh () в каждом методе, который обращается к БД (см. Строку Refresh () ниже).Поскольку я инкапсулировал свой доступ к БД в логические классы, я могу всегда выполнять там Refresh ().Я только что проверил это, и похоже, что оно работает.

Примечание. Ниже приведена переменная Database для dO4o IObjectContainer.

1 Ответ

2 голосов
/ 10 декабря 2011

1) Как вы сказали, главная проблема в том, что вы обычно не знаете, какие объекты обновлять. Вы можете использовать пропущенное событие c , чтобы обновить объекты, как только какой-либо клиент подтвердит их выполнение. db4o распространит это событие. Обратите внимание, что это также потребляет некоторый сетевой трафик и время для отправки событий. И будет период времени, когда ваши объекты будут в устаревшем состоянии.

2) Это на самом деле самый чистый метод, но не для каждого запроса БД. Используйте контейнер объекта для каждой логической единицы работы. Любая операция, которая является одной «атомарной» единицей работы в ваших бизнес-операциях.

Во всяком случае в целом. db4o никогда не создавался со сценарием клиент-сервер в качестве первого приоритета, и это проявляется в параллельных сценариях. Вы не можете избежать работы со устаревшим (и даже несовместимым) состоянием объекта, и здесь нет параметров управления параллелизмом (кроме семафоров низкого уровня).

Моя рекомендация: используйте клиентский контейнер на единицу работы. Имейте в виду, что даже тогда вы можете получить устаревшие данные, что может привести к непоследовательному просмотру и обновлению. Если в сценарии приложения редко возникают какие-либо разногласия и разногласия, и вы иногда допускаете ошибку, тогда это нормально. Однако, если вам действительно нужно убедиться в правильности, я рекомендую использовать базу данных с лучшим хранилищем параллелизма = (

...