MVC3 - использование AsyncController для предварительного заполнения ObjectCache из базы данных - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть форма, которая ищет через AJAX два разных источника данных.Данные относительно невелики, но скорость, с которой они возвращаются, низкая.

Я создал слой кеша для хранения полного результата после первого запроса ... однако я бы хотел предварительно заполнить кеш даннымипользователь выполняет поиск.

Должен ли я смотреть на AsyncController , чтобы сделать это?Любые рекомендации?

Мое желаемое поведение ( обновлено ):

  1. Пользователь запрашивает любой ActionABC какого-либо контроллера (не обязательно поисковое действие)
  2. На стороне сервера это действие проверяет кэш и асинхронно запрашивает данные, если пусто
  3. ActionABC возвращает запрошенное представление, пока кэш продолжает заполняться на сервере
  4. Если пользователь впоследствии выполняет поискво время заполнения кеша их запрос ожидает, пока заполнение кеша не будет завершено, иначе данные кеша будут немедленно доступны

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

Мне не пришлось использовать AsyncControllers.

Я использовал фабрику задач, чтобы «запустить и забыть» вызов для начальной загрузки данных при любом вызове контроллера.

Task.Factory.StartNew(() => { var x = GetData(); });

Внутри вызова «GetData» я использовал LOCK, чтобы заставить последующие вызовы ждать, пока не заполнится кэш (адреса # 4)

private static object ThisLock = new object();

protected MyData GetData()
{
  if(<MyData in cache>)
    return MyData from cache;

  lock(ThisLock)
  {
    // just entered lock, see if cache was set by previous blocking thread
    if(MyData in cache>)
      return data from cache;

    ... load MyData from database ... 

    ... save MyData  to cache ... 

    return MyData from cache;
  }
}
0 голосов
/ 15 сентября 2011

Вы можете получить выгоду от асинхронного контроллера, только если бы вы могли выполнять 2 поиска параллельно.

В этом случае ваша логика может быть:

  1. Если данныенайденные в кеше результаты немедленно возвращают.
  2. Если данные не найдены в кеше, запустите 2 параллельные асинхронные задачи для выполнения поиска.
  3. Синхронизируйте эти задачи, чтобы после того, как они оба завершили васЗаполните кэш и верните окончательный результат.

Также, если вы собираетесь использовать маршрут AsyncController, убедитесь, что вы используете async ADO.NET API для запроса вашей базы данных (command.BeginExecuteResult / command.EndExecuteResult), чтобыВы можете в полной мере использовать порты завершения ввода-вывода и не блокировать рабочие потоки во время выполнения дорогостоящих операций поиска.

...