Кэширование на стороне клиента в GWT
У нас есть gwt-клиент, который получает довольно много данных с наших серверов. Логически, я хочу кэшировать данные на стороне клиента, избавляя сервер от ненужных запросов.
На сегодняшний день я подвел его к моим моделям для обработки кэширования данных, что не очень хорошо масштабируется. Это также становится проблемой, поскольку различные разработчики в нашей команде разрабатывают свою собственную "кеширующую" функциональность, которая наводняет проект дублированием.
Я думаю о том, как можно реализовать "единую точку входа", которая обрабатывает все кэширование, оставляя модели неясно, как обрабатывается кеширование.
Есть ли у кого-нибудь опыт кеширования на стороне клиента в GWT? Существует ли стандартный подход, который может быть реализован?
Ответы
Ответ 1
Предлагаю вам посмотреть gwt-presenter и CachingDispatchAsync
. Он обеспечивает единую точку ввода для выполнения удаленных команд и, следовательно, прекрасную возможность для кэширования.
A последнее сообщение в блоге описывает возможный подход.
Ответ 2
Возможно, вы захотите взглянуть на Command Pattern; Рэй Райан провел беседу в Google IO о лучших практиках в GWT, вот стенограмма: http://extgwt-mvp4g-gae.blogspot.com/2009/10/gwt-app-architecture-best-practices.html
Он предлагает использовать командный шаблон с использованием объектов Action и Response/Result, которые вставляются и выходят из прокси-сервера службы. Это отличные объекты для инкапсуляции любого кэширования, которое вы хотите выполнить на клиенте.
Вот выдержка: "У меня есть хорошая единица валюты для реализации политик кэширования. Может быть, когда я вижу один и тот же запрос GET дважды, я буду скрывать ответ, который я получил в прошлый раз, и просто верну его себе немедленно не беспокоиться о поездке на стороне сервера.
В довольно большом проекте я принял другое направление. Я разработал объект DtoCache, который по существу содержал ссылку на каждый AsyncCallback, который ожидал ответа от вызова службы в очереди ожидания. Когда DtoCache получил объекты с сервера, они были кэшированы внутри DtoCache. Результат кэширования в дальнейшем возвращался ко всем очередным и вновь созданным AsyncCallbacks для одного и того же вызова службы.
Ответ 3
Для уже созданного, очень сложного механизма кэширования для операций CRUD рассмотрим Smart GWT. Этот пример демонстрирует способность выполнять операции на стороне клиента адаптивно (когда кеш позволяет это), сохраняя при этом поддержку поискового вызова для больших наборов данных:
http://www.smartclient.com/smartgwt/showcase/#grid_adaptive_filter_featured_category
Это поведение отображается через класс ResultSet, если вам нужно поместить собственные виджеты поверх него:
http://www.smartclient.com/smartgwtee/javadoc/com/smartgwt/client/data/ResultSet.html
Ответ 4
Существует два уровня кэширования:
- Кэширование в течение одного сеанса браузера.
- Кэширование сеансов кросс-браузера, например, кэшированные данные должны быть доступны после перезапуска браузера.
Что делать с кешем: зависит от вашего приложения, вы можете захотеть кэшировать
- Защищенные данные для конкретного пользователя
- Публичные статические (или полустатические, например, редко изменяющиеся) данные
Как кэшировать:
- Для первого уровня кеширования мы можем использовать GWT-код, как предлагается в ответах, или написать свой собственный.
- Для второго мы должны использовать функции кэширования браузера. Стандартный подход помещает ваши данные в html (будь то статические html файлы или динамические данные, созданные jsp/servlet, например). Затем ваше приложение использует методы http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsOverlay.html для получения данных.
Ответ 5
Я думал, что Itemscript был довольно аккуратным. Это база данных RESTful JSON, которая работает как на клиенте (GWT), так и на сервере.
Проверьте это!
-JP