я заметил, что когда я призываюКак GWT RequestFactory .edit() и отправка дельтах работать и как настроить его
SomeProxy proxyNew = someRequestContext.edit(proxyOld);
proxyNew.setSomething(somethingNew);
someRequestContext.mySaveMethod(proxyNew).fire();
Субъект вернулся из
@Override //from Locator<SomeEntity ,IdClass>
public SomeEntity find(Class<? extends SomeProxy > clazz, IdClass id) {
...
}
используется сервер при сохранении метод, и только значения свойства/istance переменной proxyNew переносятся на реализацию сервера mySaveMethod(SomeEntity entity)
, которые являются новыми по сравнению с возвращенным объектом.
Теперь. Я понимаю, что есть некоторое сравнение, чтобы обеспечить серверную сторону только дельтами, поэтому эффективность в общении, но я думаю, что она каким-то образом компенсируется дополнительным временем обработки/передачи, необходимым для реализации public SomeEntity find(Class<? extends SomeProxy > clazz, IdClass id)
, которая извлекает объекты сущности из базы данных.
Вопрос теперь в том, как это должно быть правильно реализовано в системе с службами persistence, предоставляемыми через сеансовый bean-компонент без состояния, которые предоставляют услуги серверам GWT-серверу/объектам DAO. Правильно реализовано таким образом, чтобы достичь максимальной эффективности и наименьшего времени ожидания. Также может ли кто-нибудь объяснить мне этот аспект/процесс RequestFactory более подробно?
Мой пример: Я извлекаю объекты OrganizerEntry
из слоя сохранения на определенный промежуток времени - неделю.
Таким образом, метод, подобный retrieveOrganizerEntries(Date from, Date to)
, вызывается в настойчивом слое.
Затем я вижу, что для каждого объекта-объекта OrganizerEntry
, который должен быть отправлен на клиентский уровень, выполняется другой запрос, например retrieveOrganizerEntry(int id)
.
Таким образом, не только одни и те же объекты запрашиваются дважды, но во второй раз они запрашиваются один за другим очень неэффективно.
Как это можно улучшить? Должен ли я кэшировать объекты DAO/servlet как-то результаты первого запроса и позволить public SomeEntity find(Class<? extends SomeProxy > clazz, IdClass id)
искать кеш? Является ли способ реализовать этот метод, возвращая null
или вновь созданный пустой объект (new OrganizerEntity()
) и перед вызовом метода persist/save от клиента, просто устанавливающего каждое значение переменной свойства/экземпляра?
Где я могу найти дополнительные примеры и объяснения по этому поводу? Потому что http://www.gwtproject.org/doc/latest/DevGuideRequestFactory.html кажется мне не очень утомительным.
Спасибо за хорошее объяснение Uemit. Таким образом, есть два способа: A) иметь один сеанс с уровнем persistance/'EntityManager' для HTTP-запроса - это будет связано с некоторыми перехватчиками или сессионными компонентами с состоянием? Прямо сейчас вызовы JPA состоят из сессионных компонентов без состояния для операций CRUD. B) «Отключение» вызова 'find()' путем переопределения 'isLive()' для возврата всегда 'true'. Интересно, что я здесь теряю с этим подходом? Какой улов? Что такое события EntityProxyChange? –
A.) Да, шаблон 'OpenSessionview' - правильный подход. К сожалению, у меня нет опыта работы с JavaEE, но с «Spring» вам просто нужно добавить фильтр сервлета. –
B.) События 'EntityProxyChange' полезны, когда вы хотите уведомить клиента о том, что объект был изменен/удален. (см. [здесь] (http://stackoverflow.com/questions/9476341/requestfactory-theory-why-is-locator-find-being-called-so-often) для более подробной информации). Если вы переопределите 'isLive()' и верните 'true', вы не получите эти события на клиенте. Большинство людей, вероятно, не заботятся об этих «Событиях». –