代码之家  ›  专栏  ›  技术社区  ›  Mike Cole

努力在ASP.NET中使用会话变量

  •  3
  • Mike Cole  · 技术社区  · 16 年前

    我尝试在ASP.NET中去掉会话变量中的所有内容(我来自Windows编程背景),通常我完全停止在会话变量中显式存储任何内容。有人能就你认为会话变量的可接受使用给出一些指导吗?

    下面是一个具体的例子……我从数据库加载一个业务对象,并填充和编辑屏幕。用户可以编辑值并保存。以前的方法是加载业务对象、加载窗体并将业务对象保存到会话变量。如果用户单击保存,我将从会话变量中检索业务对象,替换编辑的值,然后保存它。从数据库加载业务对象和加载表单的新方法。用户将编辑这些值并单击保存。我将从数据库重新加载业务对象,替换编辑后的值,然后保存它。我不是网络编程专家,但我觉得第一种方法是错误的,因为使用会话变量的耻辱很严重,第二种方法是错误的,因为它感觉像一种糟糕的方法(将业务对象加载两次)。这里不考虑任何形式的缓存。我该怎么办?

    3 回复  |  直到 15 年前
        1
  •  7
  •   JerSchneid    16 年前

    我一点也不会因为重新从发布时的数据库中加载业务对象来保存用户的更改而生气。

    该对象必须来自该回发的某个位置,与快速DB调用(如抓取特定对象)相关的有限开销可能是您的最佳选择。

    在回发时将该业务对象恢复到内存中的选项:

    • 再次从数据库中获取。缺点:一些(小)额外的数据库开销
    • 在用户会话中保存。缺点:可能仍然访问数据库(如果会话状态存储在那里)或使用大量内存(如果会话状态存储在那里),并且可能存储多个副本(如果多个用户可能正在访问此对象,最糟糕的是,如果ASP.NET出于任何原因清除了该对象,则该会话对象可能会随用户单击“提交”而消失。
    • 从缓存中。缺点:使用一些额外的内存,如果缓存不存在的话,你仍然需要去数据库,但是我会花很多钱让任何应用程序都有更大的瓶颈来使用缓存。
    • 视图状态。您可以将对象存储在视图状态中(将其发送到客户机,然后客户机将其发回)。缺点:我认为最坏的解决方案。将它添加到视图状态意味着它将越过线的下游和上游,并导致页面大小变大。会话不是最好的,但viewstate是魔鬼。
        2
  •  1
  •   Scott Ferguson    16 年前

    你有很多用户吗?

    如果您的站点是低容量的,那么在会话中存储业务对象可能是可以的。

    如果您使用SQL Server来存储会话,那么每次回发都会有效地从数据库加载业务对象。

    不过,根据经验,我倾向于使用会话来存储适用于用户会话生命周期的信息。特定于单个Web窗体的业务对象不适合此类别。对于大容量站点,此策略可能也会帮助您更好地扩展。这取决于所有相关的因素。

    :)

        3
  •  0
  •   Alex James    16 年前

    在更新之前从数据库重新加载对象可能非常危险。最终可能会丢失任何可能的并发冲突。

    例如,如果出现这种情况:

    1. 在计算机1上显示客户1的编辑屏幕
    2. 在计算机2上显示客户1的编辑屏幕
    3. 处理从计算机1到客户1的更新
    4. 从计算机2处理对客户1的更新

    (4)可能会由于并发冲突而失败,即更新正在覆盖计算机2不知道的更改。但是,通过从数据库重新加载,您将忽略这些问题并实现最后一次更新的胜利。

    因此,对于这种情况,我认为将原始实体放在会话中(或表单上的隐藏字段中)是绝对正确的,如果您关心并发性的话。

    更不用说,很多人不喜欢再次点击数据库进行额外的阅读…