Как использовать контекст Apache Cayenne в сеансе с параллельными запросами ajax?

У меня есть ObjectContext, хранящийся в сеансе. Теперь у меня есть несколько запросов ajax для одного и того же сеанса, и все они изменяют данные ObjectContext. Как я могу гарантировать, что эти запросы будут потокобезопасными?

Следующая документация предполагает, что я использую вложение контекста. Может ли кто-нибудь дать мне конкретный пример того, как это работает? Или даже объяснение того, как вложенный контекст позволит выполнять потокобезопасные запросы. Или даже ссылку на документацию с лучшими практиками в этих случаях. Спасибо!

https://cayenne.apache.org/docs/3.1/cayenne-guide/persistent-objects-objectcontext.html

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

Изменить: я нашел следующий абзац в документации, которая мне помогла.

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


person Tuan    schedule 10.04.2015    source источник


Ответы (1)


Если вы не храните незафиксированные изменения на сервере между запросами, есть еще более простое решение. Не используйте ObjectContext в области сеанса. Вместо этого используйте контекст для каждого запроса или даже для каждого метода. По методу работает в типичном случае, когда все ваши изменения, внесенные данным запросом, изолированы в пределах одного вызова метода. Затем вы создадите контекст для записи метода, загрузите объекты (с запросом или путем передачи из другого контекста через «localObject»), выполните изменения, зафиксируйте. После этого контекст отбрасывается. Например.:

public void myActionMethod() {
     ObjectContext peer = serverRuntime.newContext();
     ... do work with objects in 'peer'
     peer.commitChanges();
}

Теперь, если вы делаете сохранение незафиксированных изменений, вы по-прежнему можете использовать контексты для каждого метода, но вложенные. Таким образом, приведенный выше пример становится таким:

public void myActionMethod() {
     ObjectContext nested = serverRuntime.newContext(sessionContext);
     ... do work with objects in 'nested'
     nested.commitChangesToParent();
}
person andrus_a    schedule 10.04.2015
comment
Спасибо, андрюс! Я собираюсь изменить нашу настройку, чтобы выполнять один контекст для каждого запроса. - person Tuan; 21.04.2015