2010-10-27 75 views
1

为了提高聊天应用程序的速度,我记得静态变量(实际上是Dictionary)中的最后一个消息ID。跨多个请求的静态变量

但是,似乎每个线程都有自己的副本,因为用户没有获得生产更新(单一服务器环境)。

private static Dictionary<long, MemoryChatRoom> _chatRooms = new Dictionary<long, MemoryChatRoom>(); 

没有treadstaticattribute使用...

什么是跨所有应用程序共享几个整数快捷的方式?

更新

我知道,网络必须是无状态的。但是,对于每个规则都有一个例外。目前所有的数据都以ms sql为基础,并且在这种特殊情况下,某些共享内存将大大提高性能,并允许避免SQL请求。

我没有使用静态多年,所以我甚至错过了当它开始在同一应用程序中的多个实例的时刻。

所以,问题是在进程之间共享内存对象的最简单方法是什么?目前,我的解决方法是远程处理,但是有很多额外的代码,并且我不能100%确定这种方法的稳定性。

+0

所有应用程序?或者应用程序的所有实例?如果第二个,你可以使用'Application'变量。 – 2010-10-27 23:21:26

+0

此外,如果你想加快你的应用程序,一些最大的罪魁祸首是'asp.net debug = true',在查询中选择不必要的列/数据(如'select * from ...'),不必要的额外的数据库调用,... – 2010-10-27 23:25:37

+0

#rlb.usa - 这是我尝试的第一件事 - 我在应用程序中存储所有信息,但它不起作用。我的意思是,结果是依赖于处理请求的特定进程。 – st78 2010-10-27 23:25:38

回答

1

到目前为止,还没有简单的方法可以在流程之间进行区分。 (也许这是很好的基于隔离,缩放)。例如,这被提及明确地在这里:ASP.Net static objects

当你真正需要的Web应用程序/服务来记住一些内存的状态,而不是在数据库中,您有如下选择:

  1. 可以最大进程数= 1。需要将这段代码移至独立的Web应用程序。如果您将其设置为单独的子域,那么当从JS访问此目录时,您将遇到跨站点脚本问题。

  2. 远程处理/ WCF - 您可以在远程处理应用程序中托管关键数据,并从Web应用程序访问它。

  3. 将数据存储在每个进程中,并通过memcached同步更改。 Memcached没有实际的数据,因为它花了很长时间才将其转移。每个收藏只有最后更改的日期。

#3我能够在单个服务器上实现每秒超过100页的记录。

2

我假设你是网络编程新手。 Web应用程序与常规控制台或Windows窗体应用程序的主要区别之一在于它是无状态的。这意味着每个页面请求基本上都是从头开始初始化的。你正在使用数据库来维护状态,但是当你发现这很慢时。幸运的是你有其他选择。

如果你想记住每个用户经常访问的东西(比如他们的用户名),那么你可以使用会话。我建议阅读会话状态here。但是,要小心,不要滥用会话对象 - 因为每个用户都有自己的会话副本,所以它可以轻松使用大量的RAM,并且导致性能问题比您的数据库更多。

如果要缓存所有用户的应用程序中相关的信息,ASP.NET提供了一个framework for data caching。用最简单的方法是像一本字典,如:

Cache["item"] = "Some cached data"; 

我建议在关于ASP.NET here用于缓存的各种选项详细阅读。

总的来说,我建议你不要打扰缓存,直到你更加适应网络编程。与任何类型的全球共享数据一样,它可能会导致不可预知的问题,如果被滥用则难以确诊。

+0

我回答只是因为这可能会帮助其他人。它看起来像你完全不了解我的想法。 1)该信息不依赖于用户,并且会话状态不适合2)缓存在不同进程中具有不同的值。也许sqldependency可以工作,但是我根本不想改变所有的数据库调用 – st78 2010-10-28 01:18:54

+0

为了澄清,你想在两个web应用程序之间共享数据? – nizmow 2010-10-28 01:43:14