2

我有一个旧网站,由于性能不佳,需要进行一些优化。它是一个以 linq to sql 作为数据层,以 MVP 模式作为 UI 模式的 asp.net 购物网站。

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

首先我想好了让我们使用 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);

缺点:现在我们应该将 pagePath 链接到页面使用的每个数据库实体,但如果我这样做了,那么我将耦合事物而不是解耦合它们。这种方法也会遇到一些硬编码。

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

缺点:硬编码用户控件以动态生成 Subsituation 元素的 html 输出。

所以你有什么建议?

4

2 回答 2

1

我建议你看看 SqlDependency 类请阅读这篇文章http://www.asp.net/web-forms/tutorials/data-access/caching-data/using-sql-cache-dependencies-cs

另外,如果适合您的应用程序,我建议您考虑在应用程序启动时将数据加载到缓存中。请在此处查看一个很好的示例http://www.asp.net/web-forms/tutorials/data-access/caching-data/caching-data-at-application-startup-cs

于 2012-08-05T17:15:56.780 回答
0

使用 Linq2SQL,您可以使用LinqToCacheSqlDependency ,它为您的 LINQ 查询提供强大的缓存。它在第一次访问(底层的第一次迭代)后转换IQueryable<Products>intoIEnumerable<Products>并枚举内存IQueryable。根据SqlDependency数据更改通知,它会使列表无效,随后的访问将再次从数据库中查询,并缓存结果。

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

于 2012-08-06T13:41:24.990 回答