2010-08-02 3 views
3

Вот моя ситуация: у меня есть одностраничное приложение Java EE. Все клиент-серверная связь AJAX, основанная на JSON, используется в качестве формата для обмена данными. Один из моих запросов занимает около 1 минуты, чтобы рассчитать данные, необходимые клиенту. Также эти данные огромны (может быть> 20 МБ). Таким образом, невозможно передать целые данные в javascript за один раз. Поэтому по этой причине я передаю только несколько записей клиенту и используя сетку для отображения данных с опцией подкачки.Кэширование на стороне сервера для приложения Java/Java EE

Теперь, когда пользователь нажимает кнопку следующей страницы, мне нужно получить больше данных. Мой вопрос: как я кэшировать данные на стороне сервера? Мне нужны эти данные только для одного пользователя в качестве времени. Вы бы рекомендовали кэшировать все данные одним первым запросом с использованием идентификатора сеанса в качестве ключа?

Любые другие предложения?

ответ

1

Самый дешевый (и не столь неэффективный способ кэширования данных) в веб-приложении Java EE - использовать объект Session, как вы намереваетесь сделать. Это неэффективно, так как разработчику требуется гарантировать, что кеш не будет утечки памяти; поэтому разработчик должен аннулировать ссылку на объект, когда объект больше не нужен.

Однако, даже если вы хотите внедрить кеш бедняка, кеширование 20 МБ данных нецелесообразно, так как оно недостаточно масштабируется. Вопрос о масштабируемости возрастает, когда несколько пользователей используют одну и ту же функциональность приложения, и в этом случае 20 МБ - это много данных.

Вам лучше вернуть разбитые на страницы «наборы данных» в виде JSON, основанные на ValueList design pattern. Каждый запрос запроса данных приведет к частичному извлечению данных, который затем отправляется по проводке клиенту. Таким образом, вам не нужно кэшировать полные результаты выполнения запроса, а также вы можете возвращать частичные наборы данных. Это полностью зависит от того, хотите ли вы кэшировать; обычно кеширование выполняется для больших наборов данных, которые используются снова и снова.

+1

Мне нужно сохранить эти данные в кеше до тех пор, пока пользователь активен (пока пользовательский сеанс действителен). Производительность - единственная причина, по которой я стараюсь кэшировать такие большие данные. Запросить частичные данные так же дорого, как получение всего набора данных. Поэтому во время каждого запроса потребуется около 1 минуты, что неприемлемо. В любом случае, будет продолжать искать лучшую альтернативу. Благодарю. – ashish

1

Я предполагаю, что вы используете БД для БД для этого. Я бы использовал ограничения для возврата небольших фрагментов данных, большинство поставщиков БД имеют решение для этого. Это ускорит выполнение ваших запросов, а также большинство из JS fameworks с сетевым типом компонентов будут поддерживать пагирующие результаты (например, ExtJS).

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

Надеюсь, это поможет.

+1

У меня нет выбора, кроме как получить все данные за один проход по первому запросу. Также заполнение этих данных дорогое, и поэтому я не хочу обрабатывать каждый раз. Поэтому ограничение с помощью запроса БД не является вариантом. Благодарю. – ashish

Смежные вопросы