.net – SQL缓存和实体框架
我已经组建了一个小的ASP.NET MVC 2站点,它可以进行一些非常广泛的日期挖掘/表连接/等.
使用MVC,我有一个控制器,以许多不同的形式(表,图像等)返回数据.为了节省频繁访问数据库,我有一个双缓存机制: >对于相同操作的相同参数,我使用OutputCacheAttribute和VaryByParam =“*”. Controller内部的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对数据库的封装? 解决方法可以在SqlDependency中包装任意LINQ查询,包括EF Linq查询,参见 LinqToCache.但不幸的是,EF选择为查询制定SQL的方式,即使是最简单的from context.table select t,也是不兼容的使用Query Notificaiton限制,SqlDependency立即作为无效语句失效.我在 SqlDependency based caching of LINQ Queries年已经谈过这个问题.您可以做的是使用SqlChangeMonitor和简单的SqlCommand对象,这些对象构造为可能更改的表上的简单SELECT … FROM Table.您需要了解在设置通知的成本和轮询成本之间存在平衡,如果您的表经常更改,那么监视更改可能会比轮询更昂贵.请参阅文章The Mysterious Notification以了解QN的工作原理以及监控成本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SQLServer 进程无法向表进行大容量复制
- SQL Server T-SQL高级查询
- SqlServer数据库性能优化详解
- 将nvarchar转换为int的动态SQL错误
- sql – 尽可能多地从CLOB到VARCHAR2中选择数据,并在数据中使
- 带你熟悉SQLServer2016中的System-Versioned Temporal Tabl
- sqlserver安装问题总结(SqlServer2000/2005)
- PostgreSQL数据库服务端监听设置及客户端连接方法教程
- sql – 如何停止EF(代码优先)检查架构更改
- SqlServe零碎要点---sqlserver如何使用日期计算,DateTime类