可以使用静态变量来缓存ASP.net中的信息吗?

时间:2008-09-29 22:35:40

标签: c# asp.net caching static-variables

目前我正在使用ASP.net上的C#3.5开发项目管理应用程序。为了减少对数据库的命中,我使用静态变量缓存了大量信息。例如,用户列表在静态类中保存在内存中。该类在启动时从数据库中读取所有信息,并在更改时更新数据库,但它永远不需要从数据库中读取。

该类在写入数据库的同时ping更新信息的其他Web服务器(如果存在)。 pinging机制是一个Windows服务,缓存对象使用随机可用端口进行注册。它也用于其他事情。

数据量并不是那么好。目前我正在使用它来缓存用户(密码哈希,权限,名称,电子邮件等)。它只是保存了一堆对数据库的调用。

我想知道这种方法是否存在任何陷阱和/或是否有更好的方法来缓存数据?

5 个答案:

答案 0 :(得分:16)

陷阱:静态字段的范围是每个应用程序域,增加的负载将使服务器在池中生成更多应用程序域。如果您只读取静态数据,这不一定是个问题,但是您将在内存中获得重复数据,并且每次创建或回收应用程序域时都会受到影响。

最好使用Cache对象 - 它适用于这样的事情。

编辑:原来我对AppDomains的错误(正如评论中所指出的) - Application 的更多实例将在加载时生成,但它们都将在同一个AppDomain中运行。 (但你仍然应该使用Cache对象!)

答案 1 :(得分:4)

只要您可以预期缓存永远不会增长到大于可用内存量的大小,那就没关系。此外,请确保每个数据库只有一个此应用程序的实例,或者应用程序的不同实例中的缓存可能“不同步”。

在我工作的地方,我们有一个本土的O / RM,我们会做一些类似于你正在做的某些表格,这些表格预计不会增长或变化很大。所以,你所做的并不是前所未有的,事实上在我们的系统中,它是经过验证的。

答案 2 :(得分:4)

您必须考虑的另一个陷阱是线程安全。您的所有应用程序请求都在同一AppDomain中运行,但可能出现在不同的线程上。访问静态变量必须考虑从多个线程访问它。可能比您正在寻找更多的开销。缓存对象更适合此目的。

答案 3 :(得分:0)

嗯...“经典”方法将是应用程序缓存,但是如果您从未更新静态变量,或者了解锁定问题,并且您了解它们可以随时通过appdomain重新启动消失我真的没有看到使用静电的危害。

答案 4 :(得分:0)

我建议您研究为您的应用分配缓存的方法。您可以查看NCacheindeXus.Net

我之所以提出这个原因,是因为您推出了自己的临时更新信息的方法。静态变量/引用很好,但它们不会更新/刷新(所以你必须自己处理老化)并且你似乎有一个分布式设置。