【发布时间】:2011-08-28 03:07:41
【问题描述】:
我正在使用 SQL 服务器会话状态。
如果我正在使用调用存储在会话中的一些变量的母版页,然后稍后在后面的 aspx 代码中再次使用会话,是否会触发:
a) 2 次数据库读取,1 次在母版页进程期间读取,第二次在 aspx 运行时读取。
b) 1 次数据库读取,会话在母版页过程中加载,并在页面的生命周期中持续存在。
谢谢。
【问题讨论】:
我正在使用 SQL 服务器会话状态。
如果我正在使用调用存储在会话中的一些变量的母版页,然后稍后在后面的 aspx 代码中再次使用会话,是否会触发:
a) 2 次数据库读取,1 次在母版页进程期间读取,第二次在 aspx 运行时读取。
b) 1 次数据库读取,会话在母版页过程中加载,并在页面的生命周期中持续存在。
谢谢。
【问题讨论】:
母版页是附加到页面的用户控件,并被视为这样。因此,这个问题不仅适用于母版页,还适用于附加到页面的所有用户控件、自定义控件和标准控件。
SQL Server 存储的会话状态会根据请求在 SQL Server 中序列化/反序列化。这不是变量的请求,而是 HTTP 请求本身。
在页面生命周期中,值在 AcquireRequestState 事件中检索,并在 ReleaseRequesteState 中推送。这些事件是 HttpModule 系统的各个方面,因此由 Page 类继承。
因此,为了回答您的问题,在页面生命周期开始时(在 INIT 之前)只需一次调用 SQL Server 即可获取整个会话变量集,无论您在会话状态中有多少变量.然后在页面生命周期结束时(这是在 RENDER 和 UNLOAD 之后)有第二个数据库调用来存储会话状态
【讨论】:
读取将只产生 1,会话对象在请求开始时从存储区重新创建。
当页面将数据保存到 Session 时,该值被加载到由 HttpSessionState 类托管的定制字典类中。当正在进行的请求完成时,字典的内容将刷新到状态提供程序。如果会话状态为空,因为没有以编程方式将数据放入字典中,则不会将数据序列化到存储介质,更重要的是,不会在 ASP.NET 缓存、SQL Server 或 NT 状态服务中创建槽跟踪当前会话。这样做是出于性能原因,但对处理会话 ID 的方式有一个关键影响:为每个请求生成一个新的会话 ID,直到一些数据存储在会话字典中。 - 查看http://msdn.microsoft.com/en-us/library/aa479041.aspx了解更多详情
【讨论】: