查看状态或会话或数据库调用

时间:2011-07-19 17:47:25

标签: asp.net

我有一个asp.net页面,第一次加载时:

1:进行数据库调用并获取数据 - XML字符串(此块可超过100kb)。这个DB调用有点贵,大约需要5-10秒。

2:我遍历此XML并使用XML中的值创建自定义集合。然后将它绑定到Repeater Control。

现在转发器控件有一个文本输入。用户可以自由地在一个或多个或所有TB中输入值或将所有TB留空。然后点击“保存”按钮。

在Save Postback上,我将循环遍历Repeater中的所有行,收集所有包含输入的行,并使用初始值和新输入值生成XML并将其保存到DB。

问题: 所以我需要引用所有初始XML值。我可以考虑这些选项并寻找选择最佳选择的输入。

1: ViewState :将我的Collection或XML字符串存储在ViewState中 - 我确定它太大了

2:会话:使用Session存储xml字符串的集合 - 再次

3:数据库调用:进行数据库调用以重新获取数据 - 正如我所说这是一种昂贵的电话而我的DBA要求我避免这种情况

4: HiddenField :将XML中的基本数据存储到HiddenField中,并将其用于保存操作。即在每个中继器项目中找到所有隐藏字段

在更好的请求响应和服务器上的资源利用率方面哪一个最好? 还是有更好的方法让我失踪?

PS:只能使用ASP.NET 2.0 WebForms。

UPDATE1:

我使用ViewState尝试了以下内容:

1:存储整个xml字符串:ViewState length = 97484,FireBug显示pagesize - 162Kb

2:使用仅需要的数据存储精简版的Collection:ViewState长度= 27372,FireBug显示pagesize - 94Kb ,gzip压缩缩小为 13kb 。< / p>

使用现有网站,FireBug显示尺寸 236Kb

所以肯定选项2更好,我的新版本比当前网站更好。 那么任何输入?

2 个答案:

答案 0 :(得分:4)

一个简单的问题 - 谁是您此页面的目标受众?如果它是公司的内部网站,则只需将数据存储在viewstate中即可。如果是外部人员,例如潜在客户,然后是speed and performance probably matter to you more

  1. Viewstate - 您是否尝试过将XML添加到viewstate?它增加了多少页面大小?如果您正在对所有页面进行压缩而不是通过未压缩的线路发送它们,那么您可以看到大小减少了70% - 现在30kb并不是那么多......

  2. 会话 - 值得记住的是,如果空间不足,服务器可以并且将从会话中删除数据。他们也可以过期。您是否相信您的用户不会在新标签页中再次登录,然后提交他们在过去10小时内打开过的页面?虽然使用会话导致线路上的数据较少,但如果值因某种原因最终被丢弃,则可能需要从数据库中重新提取数据。此外,如果您处于Web场环境等中,则会出现涉及跨服务器同步会话的复杂情况。

  3. 数据库调用 - 可以以任何方式优化查询吗?所有需要它们的领域的指数是?也许你和你的DBA可以减少拉动的痛苦。但话说回来,如果数据在第一次拉动它和用户提交更改之间发生变化,那么你不想重新拉它,我怀疑。

  4. 隐藏字段 - 使用这些字段可以比将整个字符串放在Viewstate中节省更少的数据。该页面不会像会话那样取决于网络服务器的状态,也不会与其他用户竞争更改数据库的状态。

  5. 总的来说,我认为 4 可能是最好的选择,如果你有能力减慢你的网页速度。使用Firebug / YSlow并比较实现4之前和之后传输的数据量。

    最后一个想法 - 在你的其他webapp的回发之间,这样的事情如何持续存在?假设你没有自己编写完整的东西/只是刚启动它,你可能能够找到一些关于类似情况下其他开发人员如何解决问题的线索。

    修改

      

    有一个负载均衡器,不确定它将如何与Session

    一起使用

    如果您有负载均衡器,那么您需要确保会话状态存储在状态服务器或类似服务器中,而不是存储在进程中(“inproc”)。如果会话存储在网络服务器上,则选项2将与负载均衡器一起播放非常糟糕

答案 1 :(得分:1)

虽然我不是过度使用会话的忠实粉丝,但这可能是您最好的选择,因为从用户的角度来看,这将是您最快的选择。

由于会话状态确实有自己的继承问题,您可以将所需的数据加载到会话中,如果您的会话因任何原因而丢失,只需执行另一个数据库命中并重新加载它。

我真的会远离选项1和4,因为您将向客户端发送大量不必要的数据,并可能减慢他们的体验。

选项3也会减慢用户体验,所以如果可能的话,我会远离它,除非你可以加快查询时间。