Я использую сервер 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.