【发布时间】:2012-08-02 19:59:35
【问题描述】:
我有一个旧网站,由于性能不佳,需要进行一些优化。这是一个以linq to sql为数据层,MVP模式为UI模式的asp.net购物网站。
数据库中成本最高的实体是具有一对多关系的产品和类别表。这两个实体可能不会定期更改,除非管理员组的用户决定添加产品或类别……等等。我想知道为每个请求从这两个实体创建和获取所有内容的资源成本是多少!所以如果我有办法让我的数据保持活力……
首先我想好了,让我们使用 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 小时重新创建一次页面。
缺点:硬编码用户控件以动态生成替代元素的 html 输出。
那你有什么建议?
【问题讨论】:
标签: asp.net sql-server linq-to-sql webforms mvp