ASP.NET中会话变量的可接受使用

ASP.NET中会话变量的可接受使用,asp.net,session-variables,Asp.net,Session Variables,我试图戒掉在ASP.NET中删除会话变量中的所有内容(我来自Windows编程背景),并且通常完全停止在会话变量中显式存储任何内容。有谁能给你一些指导,让你觉得会话变量的使用是可以接受的吗 这里有一个具体的例子…我从数据库加载一个业务对象,并填充和编辑屏幕。用户可以编辑值并保存。旧方法是加载业务对象、加载表单并将业务对象保存到会话变量。如果用户单击“保存”,我将从会话变量中检索业务对象,替换编辑的值,然后保存它。我从数据库加载业务对象并加载表单的新方法。用户将编辑这些值并单击“保存”。我将从数据

我试图戒掉在ASP.NET中删除会话变量中的所有内容(我来自Windows编程背景),并且通常完全停止在会话变量中显式存储任何内容。有谁能给你一些指导,让你觉得会话变量的使用是可以接受的吗


这里有一个具体的例子…我从数据库加载一个业务对象,并填充和编辑屏幕。用户可以编辑值并保存。旧方法是加载业务对象、加载表单并将业务对象保存到会话变量。如果用户单击“保存”,我将从会话变量中检索业务对象,替换编辑的值,然后保存它。我从数据库加载业务对象并加载表单的新方法。用户将编辑这些值并单击“保存”。我将从数据库中重新加载业务对象,替换编辑的值,然后保存它。我不是web编程专家,但我觉得第一种方法是错误的,因为使用会话变量有着不好的污名,而第二种方法是错误的,因为它感觉像是一种糟糕的方法(加载业务对象两次)。这里我们不考虑任何形式的缓存。我该如何处理这个问题?

我一点也不介意在回发邮件时从数据库重新加载业务对象以保存用户的更改

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

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

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

    • 您有很多用户吗

      如果您的站点容量较小,则在会话中存储业务对象可能是可以的

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

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


      :)

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

      例如,如果发生此流:

    • 在计算机1上显示客户1的编辑屏幕
    • 在计算机2上显示客户1的编辑屏幕
    • 处理从计算机1到客户1的更新
    • 处理从计算机2到客户1的更新
    • (4)可能会因为并发冲突而失败,即更新正在覆盖计算机2不知道的更改。但是通过从数据库重新加载,您忽略了这些问题并实现了上次更新

      因此,对于这种情况,如果您关心并发性,那么将原始实体放入会话(或表单上的隐藏字段)绝对是正确的做法


      更不用说很多人不喜欢再次访问数据库进行额外的读取…

      是的,显然我需要使用时间戳字段,但值得注意。