Я собрал небольшой сайт ASP.NET MVC 2, который выполняет очень обширный анализ дат / объединений таблиц / и т.д.
Используя MVC, у меня есть контроллер, который возвращает данные в различных формах (таблицы, изображения и т. Д.). Чтобы сохранить частое попадание в базу данных, у меня есть двойной механизм кэширования:
- Для идентичных параметров к тому же действию я использую
OutputCacheAttribute
с VaryByParam = "*"
.
- Предполагая, что какой-то параметр к действию изменился (или вызвано другое действие), все еще возможно, что мои «данные» были запрошены ранее, поэтому я сохраняю данные в модели представления после первого обращения к базе данных Я достигаю этого с .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 моей базы данных?