Кеш сеанса в Objectify не обновляется для обновления объекта. Возвращает только устаревшие данные - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над проектом We Maven Multimodule в google appengine. Есть 3 модуля. по умолчанию, бэкэнд и api. backend и api - это модули, которые используют objectify для хранения данных, а по умолчанию содержат код внешнего интерфейса. Все веб-запросы из модуля по умолчанию обрабатываются внутренним модулем и отлично работают. Но с модулем api я столкнулся с проблемой. Некоторые данные отправляются из внешних приложений через API и сохраняются или обновляются в этом приложении с помощью Objectify. Когда я пытаюсь получить то же самое, чтобы показать его в разделе сведений о странице, возвращаются устаревшие данные (не обновленные данные). Я не сталкиваюсь с этой проблемой, когда запрос выполняется через пользовательский интерфейс.

Примечание: 1. Я настроил ObjectifyFilter в Интернете. xml как для модулей backend, так и для api. Я считаю, что это выполняет очистку при обновлении / сохранении. Он настроен для всех конечных точек в приложении. (/ *)

Это происходит только после обновления для этой сущности. Все объекты зарегистрированы.

Использование ofy.clear () перед load () работает хорошо. Я считаю, что это очищает кеш сеанса.

Нет проблем с порядком фильтрации (есть один дополнительный фильтр аутентификации в дополнение к фильтру Objectify.). ObjectifyFilter имеет приоритет, поскольку я настроил выше AuthFilter.

Я использовал масштабирование basi c, но позже удалил его, увидев поток github на Objectifyfilter topi c, но не удалось решить эту проблему.

Подобная проблема возникла еще в одном месте, но я обработал ее как отдельную очередь задач, поскольку это зависимая задача (запускается при сохранении другого объекта / обновлено). Но это унитарная операция.

Код выборки, который я использую сейчас:

log.info("DAO :: fetch()");
        if(ofy.isLoaded(Key.create(Class.forName(className),key))) {
            log.info("session cache is loaded and key is present in it.");
            ofy.clear();
        }else {
            log.info("session cache is not loaded and key is not present in it. ==========> ofy.clear()");
        }
        entity = (DAO) ofy.load().type(Class.forName(className)).id(key).now();

1 Ответ

0 голосов
/ 05 августа 2020

Кэш сеанса всегда возвращает текущее содержимое сеанса. Вам нужно знать объем сеанса во время работы - если вы используете ObjectifyFilter, по умолчанию у вас есть кеш сеанса для одного единственного запроса. Вы можете создать новые области сеанса, запустив ObjectifyService.run() или начав транзакции. Сеансы являются однопоточными, относятся только к одному потоку выполнения и должны быть недолговечными.

Если вы пытаетесь заставить несколько процессов или потоков выполнения взаимодействовать с общими данными осмысленным образом , вам, вероятно, нужны транзакции. Транзакции - единственный способ гарантировать согласованное представление данных в хранилище данных - даже без кеша сеанса данные устаревают в тот момент, когда вы их читаете (кто-то другой мог изменить их на наносекунду позже). Эту проблему решают транзакции.

...