I have put together a small ASP.NET MVC 2 site that does some very extensive date mining/table-joins/etc.
Using MVC, I have a controller that returns the data in many different forms (tables, images, etc). To save hitting the database frequently I have a dual cache mechanism:
- For identical parameters to the same action I use the
OutputCacheAttribute
withVaryByParam = "*"
. - Assuming some parameter to the action has changed (or another action is called), it is still possible that my "data" has previously been requested, so I store the data in a view model after the first hit of the database, I achieve this with a .NET 4.0
System.Runtime.Caching.ObjectCache
.
Example of the ObjectCache
inside of the Controller:
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.
This gives me a good performance improvement, but where it fails is on the CacheItemPolicy
being very simple. Ideally, I'd like the cache-window to be bigger but have the cached item expire if the database changes.
The CacheItemPolicy
seems to support this with the ChangeMonitors
collection, to which I could add a SqlChangeMonitor
, but when trying to construct this is where I come to a halt.
I am using Entity Framework 4 to access an SQL Database, how how do I construct the SqlChangeMonitor
to monitor the couple of database tables that are likely to trigger a cache expire?
SqlChangeMonitor
is constructed with an SqlDependency
which takes an SqlCommand
- how can I latch upon Entity Framework's encapsulation of my database?