2012-11-17 51 views
7

我必须将数千个记录的数据存储在数据表中并在回发时保留。哪个选项适合我viewstate(我使用)或会话。当我使用viewstate时,它会创建隐藏字段来存储它并减慢页面加载速度。那么是否有任何开销(服务器端内存消耗和响应延迟)将其存储在会话中。请给我建议解决方案哪一个更好的性能视图状态或会话

+1

您不应该在会话或视图状态下存储数千条记录。 –

+0

什么是最佳实践然后 –

+1

只提取页面上所需的数据。就像你使用数据表绑定网格一样。那么数据表应该只包含gridview当前页面上需要的那些数据。 –

回答

12

对于大量的数据,Session会更有效率。如果您可以检测用户何时完成特定数据块,请将Session变量设置为空,以帮助解决内存开销。你不能总是这样做,但会话最终会过期,然后内存将被回收。降低会话超时可以帮助某些人,但不要将其设置得太小,您不希望切断用户。会话需要在您的Web.config文件中启用。

下面是会话与视图状态的基本原则:

视图状态:ViewState中的二进制数据结构Base64编码被放置到该页面,这意味着它是1.3333倍(8/6)的尺寸的原始二进制数据。这些数据是为每个页面视图上传和下载的。所以如果你在ViewState中有很多它会影响页面响应时间。 Base64编码可能是高度优化的,所以这不是性能问题。每个页面请求将分配,然后释放ViewState的空间,所以它不是一个长期的内存命中。由于数据在页面中,因此不会过期。

会话:会话中的所有数据都保存在页面加载之间的Web服务器中。这使页面变小,它只需携带会话标识符。另一方面,用于在会话中存储数据的任何内存都将保持分配状态,直到会话过期。我想知道会话是复制二进制数据还是只保留一个指针。与Base64编码一样,这可以高度优化,所以如果发生这种情况,它不会影响性能。如果用户在页面查看之间等待时间过长,则会话可能会过期。如果会话过期,它应该将用户返回到网页中的某个已知状态。

这里还有一个问题,如果您要在会话中存储信息,会话ID可能会在客户端浏览器中的多个选项卡之间共享。您必须小心如何使用会话中存储的数据。确保你测试这个,这样你的用户不会得到意想不到的结果。

(注意:使用ViewState是RESTful,Session不是)。

+0

如果我完全使用会话变量而不是viewstate会发生什么? –

+0

Viewstate更耐用,因为它由用户的浏览器维护。因此,即使用户在页面上坐了一个小时,然后点击某个地方,页面仍然会保持视图状态,而Session可能已过期。诀窍是找到合适的平衡点。 – gmlobdell

+0

是的,你是对的,但我想要的东西不同,在这两种情况下加载页面时所需的内存消耗和时间是多少 –

相关问题