Asp.net 缓存数据直到更改

Asp.net 缓存数据直到更改,asp.net,sql-server,linq-to-sql,webforms,mvp,Asp.net,Sql Server,Linq To Sql,Webforms,Mvp,我有一个旧网站,需要一点优化,因为性能差。它是一个asp.net购物网站,以linq到sql作为数据层,以MVP模式作为UI模式 数据库中成本最高的实体是具有一对多关系的产品和类别表。这两个实体可能不会定期更改,除非管理员组的用户决定添加产品或类别…等等。我想知道为每个请求创建和获取这两个实体的所有内容会花费多少资源!所以如果我有办法让我的数据保持活力 首先我想好了,让我们使用AJAX进行数据检索,这样我将只创建那些需要查询或绑定的实体,但是等等,如果不创建新的DataContext实例,我怎么

我有一个旧网站,需要一点优化,因为性能差。它是一个asp.net购物网站,以linq到sql作为数据层,以MVP模式作为UI模式

数据库中成本最高的实体是具有一对多关系的产品和类别表。这两个实体可能不会定期更改,除非管理员组的用户决定添加产品或类别…等等。我想知道为每个请求创建和获取这两个实体的所有内容会花费多少资源!所以如果我有办法让我的数据保持活力

首先我想好了,让我们使用AJAX进行数据检索,这样我将只创建那些需要查询或绑定的实体,但是等等,如果不创建新的DataContext实例,我怎么能做到这一点?!! 另一方面,由于内存开销,对整个DataContext使用缓存被认为是一个错误的决定。那么,这里的最佳选择是什么?我该如何改进

更新

1) 按照@HatSoft的建议做

缺点:这些方法对代码没有帮助,只对数据库有帮助。除此之外,可能还有内存问题,因为我们将数据放在内存中,而不是呈现的html,但是这可能是关于解耦合的最佳选择

2) 使用输出缓存,我们在带有*.aspx通配符的http处理程序中拥有以下代码:

string pagePath = Context.Request.Url.AbsolutePath;
object cacheKey = application[pagePath];
if(cacheKey == null)
  return; //application restarted/first run so cache the stuff
else
  Context.Response.RemoveOutputCacheItem(pagePath);
缺点:现在我们应该将页面路径链接到页面使用的每个数据库实体,但是如果我这样做,那么我将耦合事物,而不是去耦合它们。这种方法也会遇到一些硬编码

3) 另一种解决方案是以后缓存模式而不是控制缓存模式进行输出缓存。使用Substituation元素并将OutPutCache持续时间设置为86400,以便每24小时重新创建一次页面

缺点:对用户控件进行硬编码,以动态生成Substituation元素的html输出


那么您有什么建议?

我建议您查看SqlDependency类,请阅读本文

此外,如果适合您的应用程序,我建议您在应用程序启动时在缓存中加载数据。请在这里看到一个很好的例子,它可以使用Linq2SQL,为您的LINQ查询提供一个强大的缓存。它将
IQueryable
转换为
IEnumerable
,并在第一次访问后枚举表单memmory(底层
IQueryable
的第一次迭代)。基于
SqlDependency
数据更改通知,它将使列表无效,随后的访问将再次从数据库查询,并缓存结果


我的建议是将产品列表和类别缓存在内存中,因为它们很少更改,而且我希望它们的大小相当有限

每次从内存缓存返回列表时,都会保存一个DB命中。1)相同的数据可以用于许多HTML输出(例如,缓存类别列表,它用于任何页面响应)。2) 数据具有明确的过期语义(SqlDependency将在对Categories表的任何后端更新中使缓存失效)。3) 您仍然可以缓存生成的HTML,以保存处理。每个缓存必须至少使用数据库一次,否则不是缓存。没有人提到
SqlCacheDependency
,我说
SqlDependency
。我有很多查询,其中一些违反了sql查询通知规则。我认为解决方案3在重构和应用单一责任方面相当不错。你怎么认为?