我有一个遗留网站,由于性能不佳需要一些优化。它是一个asp.net购物网站,linq to 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);
缺点:现在我们应该将pagePath链接到页面使用的每个数据库实体,但如果我这样做,那么我将耦合事物而不是解耦。这种方法也会遇到一些硬编码。
3)另一种解决方案是在缓存后模式下输出缓存而不是控制缓存模式。使用Subsituation元素并将OutPutCache Duration设置为86400,以便每24小时重新创建一次页面。
缺点:硬编码用户控件,动态生成Subsituation元素的html输出。
所以你有什么建议?
答案 0 :(得分: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
答案 1 :(得分:0)
使用Linq2SQL,您可以使用LinqToCache为您的LINQ查询提供SqlDependency
供电缓存。它将IQueryable<Products>
转换为IEnumerable<Products>
并在首次访问后枚举表单memmory(基础IQueryable
的第一次迭代)。基于SqlDependency
数据更改通知,它使列表无效,后续访问将再次从DB查询,并缓存结果。
我的建议是将产品列表和类别缓存在内存中,因为它们很少变化,我希望它们具有相当大的约束。