SQL Caching и Entity Framework - PullRequest
       6

SQL Caching и Entity Framework

8 голосов
/ 25 августа 2010

Я собрал небольшой сайт ASP.NET MVC 2, который выполняет очень обширный анализ дат / объединений таблиц / и т.д.

Используя MVC, у меня есть контроллер, который возвращает данные в различных формах (таблицы, изображения и т. Д.). Чтобы сохранить частое попадание в базу данных, у меня есть двойной механизм кэширования:

  1. Для идентичных параметров к тому же действию я использую OutputCacheAttribute с VaryByParam = "*".
  2. Предполагая, что какой-то параметр к действию изменился (или вызвано другое действие), все еще возможно, что мои «данные» были запрошены ранее, поэтому я сохраняю данные в модели представления после первого обращения к базе данных Я достигаю этого с .NET 4.0 System.Runtime.Caching.ObjectCache.

Пример ObjectCache внутри контроллера:

private static readonly ObjectCache cache = 
      new MemoryCache("CompareControllerCache");
private static void CacheObject(ViewModel obj, 
                                string param1, 
                                int someOtherParam )
{
    string key = string.Format("{0}-{1}", param1, someOtherParam);
    Trace.WriteLine(string.Format("Adding {0} to the cache", key));
    cache.Add(key, obj, new CacheItemPolicy
         {
             SlidingExpiration = TimeSpan.FromMinutes(1)
         });
}

// Corresponding GetCachedObject with similar key defining logic.

Это дает мне хорошее улучшение производительности, но там, где это не получается, CacheItemPolicy очень прост. В идеале я хотел бы, чтобы окно кэша было больше, но срок действия кэшированного элемента истекает при изменении базы данных.

Кажется, что CacheItemPolicy поддерживает это с коллекцией ChangeMonitors, к которой я мог бы добавить SqlChangeMonitor, но при попытке построить это - то, где я остановился.

Я использую Entity Framework 4 для доступа к базе данных SQL, как как создать SqlChangeMonitor для мониторинга пары таблиц базы данных, которые могут вызвать истечение срока действия кэша?

SqlChangeMonitor построен с SqlDependency, который занимает SqlCommand - как я могу зафиксировать инкапсуляцию Entity Framework моей базы данных?

Ответы [ 2 ]

7 голосов
/ 25 августа 2010

Можно обернуть любой произвольный запрос LINQ в SqlDependency, включая запросы EF Linq, см. LinqToCache . Но, к сожалению, способ, которым EF выбирает формулировку SQL для запросов, даже самых простых from t in context.table select t, несовместим с ограничением Query Notificaiton, и SqlDependency сразу становится недействительным как недопустимый оператор. Я говорил об этом в SqlDependency кешировании LINQ Queries .

То, что вы можете сделать, это использовать SqlChangeMonitor с простыми SqlCommand объектами, сконструированными как простые SELECT ... FROM Table на ваших столах, которые могут измениться. Вы должны понимать, что существует баланс между стоимостью настройки уведомлений и стоимостью опроса, если ваши таблицы часто меняются, тогда мониторинг изменений может оказаться более дорогим, чем опрос. См. Эту статью Таинственное уведомление , чтобы понять, как работает QN и какова стоимость мониторинга.

2 голосов
/ 22 октября 2010

привет ответ с реализацией можно найти на сайте ниже

http://harismile.wordpress.com/2010/09/09/mvc-with-ef-sqldependencycache/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...