Немного предыстории: я работаю над веб-приложением, которому требуется довольно много времени для подготовки / обработки данных, прежде чем предоставить их пользователю для редактирования / манипулирования. Задача запроса данных ~ 15/20 секунд для завершения и несколько секунд для обработки. Оказавшись там, пользователь может манипулировать vaules на лету. Любая манипуляция значениями потребует полной обработки данных.
Обновление: чтобы избежать путаницы, я делаю вызов данных только 1 раз (удар 15 секунд), а затем хочу сохранить результаты в памяти, чтобы мне не пришлось вызывать его снова, пока пользователь не выполнит 100% работая с этим. Итак, первая попытка займет некоторое время, но, используя Ajax, я собираюсь попасть в данные в памяти, чтобы постоянно обновлять и поддерживать время отклика около 2 секунд или около того (я надеюсь).
Чтобы сделать это эффективным, я перемещаю исходные данные в память и использую обратные вызовы Ajax на сервер, чтобы я мог сократить время обработки для обработки пересчета, который происходит с обновлениями этого пользователя.
Вот мой вопрос, с точки зрения производительности, как лучше всего хранить эти данные, предполагая, что только один пользователь будет работать с этими данными в любой момент.
Кроме того, пользователь потенциально может работать в этом процессе в течение нескольких часов. Когда пользователь работает с данными, мне понадобится какой-нибудь отказоустойчивый для сохранения текущих данных пользователя (либо в БД, либо в сериализованном двоичном файле), если его сеанс каким-либо образом прервется. Другими словами, мне понадобится решение, которое имеет соответствующий хук, позволяющий мне выгружать данные объекта памяти в случае, если пользователь слишком долго отключается / отвлекается.
Пока вот мои размышления:
Состояние сеанса - Плюсы: заблокировано для одного пользователя. Имеет событие Session End, которое будет соответствовать моим требованиям безопасности. Минусы: самый медленный из моих текущих вариантов. Событие окончания сеанса иногда сложно обеспечить корректное срабатывание.
Кэширование - Плюсы: Хорошая производительность. Имеет доступ к зависимостям, которые могут быть бонусом позже, но не очень полезны в текущей области. Минусы: нет простого отказоустойчивого шага, кроме записи, основанной на временных интервалах. Глобальный по объему - должен обеспечить, чтобы пользователи не сталкивались с работой друг друга.
Статика - Плюсы: Лучший Перф. Легко поддерживать, поскольку я могу напрямую использовать свои текущие классовые структуры. Минусы: нет простого отказоустойчивого шага, кроме записи, основанной на временных интервалах. Глобальный по объему - должен будет гарантировать, что пользователи не сталкиваются с работой друг друга.
Есть ли у кого-нибудь какие-либо предложения / комментарии по поводу того, какой вариант я должен выбрать?
Спасибо!
Обновление: забыл упомянуть, я использую VB.Net, Asp.Net и Sql Server 2005 для выполнения этой задачи.