【问题标题】:Which is better for performance viewstate or session哪个更适合性能视图状态或会话
【发布时间】:2012-11-17 08:00:14
【问题描述】:

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

【问题讨论】:

  • 您不应在会话或视图状态中存储数千条记录。
  • 只获取页面上需要的数据。就像您使用数据表绑定网格一样。那么数据表应该只包含gridview当前页面上需要的那些数据。
  • 这可能是答案,但我必须在 gridview 中显示所有记录并维护数据的更改并再次绑定到 gridview
  • 这是一个完美的例子aspsnippets.com/Articles/…

标签: asp.net session viewstate


【解决方案1】:

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

以下是 Session 与 ViewState 的基本准则:

ViewState:ViewState 的二进制数据结构是经过 Base64 编码后放入页面的,也就是说它是原始二进制数据大小的 1.3333 倍(8/6)。为每个页面视图上传和下载此数据。因此,如果您在 ViewState 中有很多内容,它会影响页面响应时间。 Base64 编码可能经过高度优化,因此不会影响性能。每个页面请求都会为 ViewState 分配然后释放空间,因此这不是长期内存命中。由于数据在页面中,因此不会过期。

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

这里还有一个问题,如果您在会话中存储信息,会话 ID 可能会在客户端浏览器中的多个选项卡之间共享。您必须小心如何使用存储在 Session 中的数据。请务必对此进行测试,以免您的用户得到意外结果。

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

【讨论】:

  • 如果我完全使用会话变量而不是视图状态会怎样?
  • Viewstate 更持久,因为它由用户的浏览器维护。因此,即使用户在页面上坐了一个小时,然后单击某处,该页面仍将保持视图状态,而 Session 可能已经过期。诀窍是找到合适的平衡点。
  • 是的,你是对的,但我想要一些不同的东西,在这两种情况下加载页面时所需的内存消耗和时间是多少
  • @eraj 我真的很想回答你的问题,但是确实需要太多细节才能给你一个明确的答案。基本上,我必须查看您的整个应用程序,然后在您的环境中对其进行测试,并使用几种不同的浏览器和具有不同类型网络连接的客户端对其进行测试。 krshekhar 确实在上面确实有道理,不要存储所有数据。存储足够的元信息以再次检索数据或下一页数据或其他任何内容。然后优化数据存储,使查询运行得足够快,用户不会注意到。
  • 感谢所有回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多