在asp.net中使用太多会话的缺点

时间:2013-10-08 02:19:33

标签: asp.net session

在ASP.NET中,会话使我们能够在用户在Web应用程序中导航ASP.NET页面时为用户存储和检索值。但是,不鼓励使用过多的会话。为什么?使用太多会话有什么缺点?

感谢那些愿意回答的人。

2 个答案:

答案 0 :(得分:12)

记忆和/或表现

如果您在进程中存储会话状态(默认值),则所有会话数据都存储在应用程序池的本地内存中。如果您有数千名用户,您可以看到为什么这可能是一个问题。当开发人员不再需要删除会话变量时(由于很难控制访问网页的顺序这一事实很常见)和/或当用户不需要时,问题会变得更糟显式注销(例如,通过关闭浏览器窗口),这使得所有这些内存仍然分配但不再使用。

如果您将会话状态存储在进程外(例如,在SQL Server或单独的状态服务器中),则所有会话变量最终都会通过网络传输。随着您添加更多变量,越来越多的数据必须被拉过来。这最终可能会降低性能。

并发

如果Web应用程序使用会话状态,则必须保护访问会话状态的数据免受竞争条件和其他多线程问题的影响。因此,ASP.NET会自动序列化任何使用会话的请求。如果您同时发送两个请求,ASP甚至不会在第二个请求启动,直到第一个请求完成。这可能会导致使用大量AJAX或其他应该是异步的逻辑的应用程序出现意外和性能不佳。

基础设施

如果您使用本地内存进行会话状态,并且您的Web应用程序是负载平衡的,则负载均衡器必须使用IP地址或cookie强制执行会话粘性。这会限制负载均衡器处理请求的方式 - 特定会话的所有请求总是命中同一服务器 - 这会降低整体性能并消除冗余。

数据丢失

如果应用程序池循环使用,则该应用程序池上运行的所有会话都将失去会话状态,通常需要用户注销并重新开始。

代码设计不佳

会话变量本质上是全局变量。过度使用全局变量往往会导致代码结构松散。变量应始终尽可能紧密。

答案 1 :(得分:0)

基本上,它消耗服务器内存。由于通常会话存储在进程中,因此无法在两个或多个状态服务器之间共享此解决方案。