2010-03-25 98 views
1

在我的.NET Web应用程序中,我将基本用户信息保存在用户会话对象中。我通常还会在会议中保留一个导演班;这基本上只是有关于它在屏幕上工作的任何信息(如客户ID)的信息。管理会话变量的最佳方式是什么?

我正在努力避免添加大量会话。我也想确保在任何给定的时间只有必要的会话在内存中。

这意味着我需要管理我的会话变量的有效途径。有什么建议么?

+1

欢迎来到SO。您可能需要添加编程语言特定标签以吸引更多观众。另外,我并不完全了解您的问题,您是否在谈论有很多用户会话(为什么他们都会同时激活?)或您在会话中存储的大量每用户数据? – 2010-03-25 17:12:41

回答

0

我通常所做的只是保持Session中的对象的id,并将数据保存在数据库前面的缓存层中。这样,您的会话保持相当小,但如果项目在缓存中,大多数数据仍可以有效地检索。这对我来说通常效果很好。

-4

我的建议:不要使用会话变量。将所有内容存储在数据库中

+0

-1 - 您不希望将临时信息(如会话信息)存储在数据库中。 – JonH 2010-03-25 17:15:37

+2

这不是一个/或选择。你可以将会话持久化到数据库,这实际上是我的首选方法。 – RedFilter 2010-03-25 17:17:58

+0

除非你有多个网络服务器,在这种情况下你要做你应该做的事情。 (即使那样,仍然有更好的选择。) – 2010-03-25 17:18:12

1

两件事情:

1 - 你不应该在会话中存储这么多,内存管理是一个问题。即,不要在会话中存储对象,存储指向事物的指针,而不是用户的实例只存储用户ID。如果需要,可以添加信息检索的缓存,但应该位于与会话分开的缓存层中。

2 - 使用数据库会话,所以不存在有关服务器内存的关注,让您可以根据需要轻松添加更多的Web服务器(注意,StateServer给你这个能力以及)。此外,这可以让您重新使用应用程序池,而无需用户丢失会话。这是我做这件事的主要原因 - 它可以让我随时部署。

治疗会话这么细究其原因,是他们流连用户最近的请求后,一般为10〜20分钟。因此,如果在会话中存储大型对象,来自多个不同会话的请求可能会占用大量服务器内存。做更疯狂的事情,比如在会话中存储数据库连接,可能会导致您使用所有可用的数据库连接,这是因为有太多内存在内存中等待会话过期。

理想的情况下,有没有需要会话的“管理”。

+0

+1好得多的建议,存储轻量级数据,而不是实际的对象/数据集/表等。 – JonH 2010-03-25 17:17:43

0

我认为你误会ASP.NET中的会话。你没有明确地管理它们(尽管你可以,你很少会想),它们是由ASP.NET和IIS隐式创建和销毁的。每个用户都有一个会话。

现在任何你存储用户会话内部存储器中存储的服务器上,所以如果你经常放置大型物体在每个用户会话,这将导致内存快速增长导致的性能和可扩展性的问题。

你需要在会​​话存储的唯一数据是要横跨要确保它不是提供给一个cookie或类似的结构在客户端不同的页面请求提供瞬态数据。

但是读你在做什么这极有可能是没有必要的。由于您正在使用特定页面和“导演”功能,因此这很可能适合放置在视图状态的页面上作为中介数据存储。

0

没有赖特的答案。这取决于并发用户的数量,取决于内存的大小。 如果您在proc中拥有会话变量,则保持会话上的内容比在数据库上更快。 我通常会尽量只保留我知道用户在特定任务期间可能需要的内容,或者像您说的那样,保留当前用户的信息。

0

我的建议是:

  • 总结会议进入到IPerSessionCache接口
  • 有一个具体的实现这个接口
  • 使用具体类的代码得到一个instace的/设置会话数据
  • 由此,您可以自由清理会话结束时的IPerSessionCache实例
  • 代码不需要知道IPerSessionCache的位置实际存储数据(即。它可以在会话或者数据库或者cookie等)
  • 特别是如果你使用一个DI容器管理&创建实例

HTH你会对IPerSessionCache的寿命更好的控制。

相关问题