首页 文章

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

提问于
浏览
23

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

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

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

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

5 回答

  • 4

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

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

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

  • 4

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

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

  • 0

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

  • 0

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

  • 16

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

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

相关问题