В своем проекте используем CacheDependency для динамического обновления кеша в зависимости от изменений в базе данных. При первом запуске устанавливаются зависимости: объект в кеше - строка в базе данных. Если значения в строке таблицы базы данных меняются, то меняется кеш сбрасывается и данные запрашиваются для данной строки повторно.
В работе возникла следующая проблема. Если объектов > 500, то первый запуск выполняется долго. Как оказалось, установка зависимостей для каждого объекта со строками базы данных занимает большое количество времени (10-ки секунд), так как для каждого объекта выполняется запрос в базу данных по ключу. А чем больше объектов, тем больше запросов.
Чтобы решить эту проблему, я предложил записывать объекты в кеш асинхронно в отдельном потоке. Алгоритм следующий: считываем объекты из базы, отображаем их пользователям и параллельно запускаем процесс записи объектов в кеш. Пользователь видит данные сразу и не ждет пока они добавятся в кеш.
Сначала мы хотели использовать Asynchronous Controller, но так как классы по работе с объектами мы вынесли в отдельный проект, то всю логику по работе с кешем мы оставили в этом проекте и не стали переносить в контроллер. Для реализации асинхронности мы решили использовать BackgroundWorker.
Здесь нас ждала следующая проблема. Приложение MVC не отображало данные пользователям до тех пор, пока метод сохранения объектов в кеш не завершался. То есть по сути BackgroundWorker не работал.
Тогда мы стали использовать Thread.
И все получилось!
Метод выполнялся асинхронно в отдельном потоке, а пользователи уже работали с данными.
В следующий раз напишу более подробно о CacheDependency.
В работе возникла следующая проблема. Если объектов > 500, то первый запуск выполняется долго. Как оказалось, установка зависимостей для каждого объекта со строками базы данных занимает большое количество времени (10-ки секунд), так как для каждого объекта выполняется запрос в базу данных по ключу. А чем больше объектов, тем больше запросов.
Чтобы решить эту проблему, я предложил записывать объекты в кеш асинхронно в отдельном потоке. Алгоритм следующий: считываем объекты из базы, отображаем их пользователям и параллельно запускаем процесс записи объектов в кеш. Пользователь видит данные сразу и не ждет пока они добавятся в кеш.
Сначала мы хотели использовать Asynchronous Controller, но так как классы по работе с объектами мы вынесли в отдельный проект, то всю логику по работе с кешем мы оставили в этом проекте и не стали переносить в контроллер. Для реализации асинхронности мы решили использовать BackgroundWorker.
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += Наш метод сохранения объектов в кеш;
backgroundWorker.RunWorkerAsync();
Здесь нас ждала следующая проблема. Приложение MVC не отображало данные пользователям до тех пор, пока метод сохранения объектов в кеш не завершался. То есть по сути BackgroundWorker не работал.
Тогда мы стали использовать Thread.
var thread= new Thread(Наш метод сохранения объектов в кеш);
thread.Start();
И все получилось!
Метод выполнялся асинхронно в отдельном потоке, а пользователи уже работали с данными.
В следующий раз напишу более подробно о CacheDependency.
Комментарии
Отправить комментарий