23

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

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

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

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

4

5 回答 5

16

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

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

编辑:原来我对 AppDomains 的看法是错误的(正如评论中指出的那样) - 更多的应用程序实例将在负载下生成,但它们都将在同一个 AppDomain 中运行。(但您仍然应该使用 Cache 对象!)

于 2008-09-29T22:42:08.073 回答
4

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

在我工作的地方,我们有一个本土的 O/RM,我们做的事情类似于你对某些预计不会增长或改变太多的表所做的事情。所以,你所做的并不是史无前例的,事实上在我们的系统中,是经过验证的。

于 2008-09-29T22:49:25.203 回答
4

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

于 2008-09-29T22:52:29.577 回答
0

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

于 2008-09-29T22:38:30.393 回答
0

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

我建议这样做的原因是您采用了自己的临时方式来更新您正在缓存的信息。静态变量/引用很好,但它们不会更新/刷新(所以你必须自己处理老化)并且你似乎有一个分布式设置。

于 2008-09-30T01:48:30.810 回答