【发布时间】:2010-05-16 09:48:52
【问题描述】:
是否有某种会话大小限制或不超过的可取值?
在我的 Web 应用程序中,我创建了一些 DataTables 来存储用户选择,这些选择存储在会话中,直到用户批准选择,因此我将这些值添加到数据库中。
问题是我不知道会话是否足够可靠以保持少量对象?
谢谢!
更多信息
会话大小最大约为 10-20KB。
【问题讨论】:
-
进程内还是进程外?
是否有某种会话大小限制或不超过的可取值?
在我的 Web 应用程序中,我创建了一些 DataTables 来存储用户选择,这些选择存储在会话中,直到用户批准选择,因此我将这些值添加到数据库中。
问题是我不知道会话是否足够可靠以保持少量对象?
谢谢!
更多信息
会话大小最大约为 10-20KB。
【问题讨论】:
以下是关于 Session 状态的一些注意事项:
mode="InProc") 会话状态受限于工作进程可用的内存量。只存储对象引用,而不存储对象本身。进程外状态管理在持久化对象之前对其进行序列化:
使用会话状态服务器 (mode="StateServer") 的进程外状态管理受限于状态服务可用的内存量。
使用 SQL Server (mode="SQLServer") 的进程外状态管理仅受 SQL image 数据类型的最大大小或数据库的最大允许大小限制。
显然,工作进程仍然必须有足够的可用内存才能将会话对象拉回内存并在 http 请求期间重新水合。
正如我之前提到的,进程外状态管理序列化对象,然后再持久化它们。
这意味着对象必须是可序列化的,排除,例如XmlDocument 或任何从MarshalByRef 继承的对象。
尝试序列化此类对象将导致以下异常:
无法序列化会话状态。在“状态服务器”和 'SQLServer' 模式,ASP.NET 将序列化会话状态对象, 结果是不可序列化的对象或 MarshalByRef 对象 不允许。如果类似的序列化,同样的限制适用 由自定义会话状态存储在“自定义”模式下完成。
【讨论】:
是的,它足够可靠。它只是不是很可扩展,所以请提前计划。当您在超过 1 个服务器上运行它时,这将完全停止。
并且有某种限制:并发用户数 * SizeOf-Session
这当然取决于表的大小,存储几 kB 通常是可以接受的(尽管高流量网站会尽量保持较小)。
如果您的用户可以共享表,那么您可以将该数据放在 Application 对象中,这样可以节省很多。
并且会话对象仅限于 TimeOut 设置,默认为 20 分钟。优化内存消耗的一种方法是减少内存消耗,但这是与用户便利性的权衡。
【讨论】:
我假设您将会话存储在“inProc”模式下。在这种模式下,ASP.NET 应用程序的会话、缓存等存储在 Web 服务器的 RAM 中(通过 aspnet_wp.exe 进程)。 .NET 并不能全部使用。 machine.config 中有一个设置告诉阈值限制(默认为 60%)。一旦达到此阈值,IIS 将回收工作进程,并丢失所有会话信息。
请注意,如果您的服务器托管多个 asp.net 应用程序,则 60% 的内存将由所有应用程序共享。因此,如果累积内存使用量达到阈值,工作进程仍然会被回收。
除了优化您的应用程序以减少使用会话之外,另一种方法是将应用程序设置为在进程外模式下使用会话(使用 stateserver 或 sqlserver 来存储会话信息)。
进程外模式会降低系统性能。
有关会话状态管理的更多信息,请参阅this 文章。
【讨论】:
您应该始终假设 session 是一个非常有价值的存储空间并且非常有限。消耗应尽可能少,因为您永远无法知道应用程序将支持多少用户。
DataTable 可能太大而无法存储在会话中,除非它可以保持足够小。
【讨论】: