【发布时间】:2008-11-01 16:19:25
【问题描述】:
什么是可取的,将数据集保持在会话中还是在每次回发时填充数据集?
【问题讨论】:
标签: asp.net session dataset postback populate
什么是可取的,将数据集保持在会话中还是在每次回发时填充数据集?
【问题讨论】:
标签: asp.net session dataset postback populate
这取决于许多因素。如果您的会话在进程中或在状态服务器上,通常最好不要在会话内存中保留太多项目,因为它的可扩展性较低。
如果您的会话驻留在数据库中,最好只重新查询并重新填充数据集,除非查询的执行成本很高。
【讨论】:
不要使用会话!!!如果用户使用不同的请求打开第二个选项卡,则会话将被重用,结果将不是他/她期望的结果。您可以使用 ViewState 和 Session 的组合,但在诉诸缓存之前,仍要衡量在没有任何类型缓存的情况下您可以处理多少。
【讨论】:
这取决于您执行此操作的程度以及会话数据在服务器上的存储位置。
将数据集保持在会话中肯定会影响内存使用。所有会话变量都存储在内存中,如果您使用 SQL Server 状态,则存储在 SQL Server 中。您还可以使用 State Server 模式将负载卸载到另一台机器上。
序列化/反序列化方面。如果您使用非常大的数据集,可能会严重影响服务器的 seide 性能。
另一方面,页面上的视图状态非常大可能会成为真正的性能杀手。因此,我会将数据集保存在会话中或缓存中,并寻找一种“outproc”方式来存储该会话数据。
【讨论】:
由于我希望尽可能少的数据库操作,我会将数据保留在会话中,但我不确定最好的方法是什么。我如何处理并发,而且由于两个用户同时使用页面时数据是共享的,我如何确保他们每个人在会话中都有自己的数据集?
【讨论】:
如果它不是太大和/或数据库又远又慢,我通常会保持它在会话中。如果数据很大,一般情况下最好重新加载。
有时我使用缓存,我第一次从 Db 加载并将其放入缓存中。在回发期间,我检查 chache,如果它是空的,我会重新加载。 所以服务器自己管理缓存。
【讨论】:
会话的问题在于,如果它在 proc 中,它可能会消失,这不是很好,如果它是状态服务器,那么你必须序列化,如果它是 sql,那么你无论如何都要进行往返!
如果结果集很大,请执行自定义分页,以便您只返回总结果的一小部分。
然后,如果您认为多个用户会看到此结果集,请将每个页面作为用户页面放入缓存中,以确保在数据更改或一段时间未访问后更新缓存。
如果您不想进行多次往返,并且您认为自己拥有内存,那么将整个数据集放入缓存中,但要小心它不会破坏 Web 服务器。
使用缓存意味着用户不需要自己的数据集,而是使用全局集。
就并发性而言,当您加载插入/编辑页面时,您需要使用新数据填充它并在添加/更新后更新缓存。
【讨论】:
我非常相信解耦,我很少(如果有的话)认为需要将完整的数据集扔到用户界面。
您实际上应该只将对象传递给需要使用的 UI,因此除非您展示的是大图表或某种需要显示数据之间关系的数据结构,否则不值得。
在适用的情况下,更小的数据子集效率更高。您的应用程序实际上是否使用了 UI 数据集中的所有功能?如果没有,那么最好的方法是只传递您正在显示的数据。
如果您将数据绑定到控件并通过它进行排序/分页等,您可以在更小的代码中实现许多使数据集能够支持此功能的接口。
在此说明中,我会在缓存中保留大部分是静态的数据(例如,它不会经常更新)。因此,您需要先了解数据的更新频率,然后才能真正做出决定。
最后,我再说一遍,我认为在 UI 中使用数据集的必要性非常非常少。它是一个非常繁重的数据对象,查看数据需求的成本效益与实施的简易性相比,可能远远超过缓存数据集的需要。
恕我直言,如果您担心性能或内存利用率,那么使用数据集是相当糟糕的。
【讨论】:
您的回答并未暗示数据的使用。是参考数据吗?用户是否在积极更新它?是否意味着多个用户在任何时候都具有更新访问权限?
如果没有比您提供的更好的信息,请遵循公认的观点,即在会话中保留大量数据是一种保证您的应用程序不会扩展并且需要大量资源来提供服务的方法几个人。
通常有更好的方法来管理大型数据集,而无需将所有数据加载到内存中。
否则,如果您的应用程序数据需求确实非常庞大,那么请考虑使用带有 Web 服务后端的重型客户端。它可能比制作网页更适合。
【讨论】:
正如其他答案所指出的,答案“取决于”。但是,我假设您正在谈论用户之间共享的数据。在这种情况下,您应该不将数据集存储在用户的会话中,而是在回发时重新填充。
此外,您应该在应用程序的数据访问层附近填充缓存,以提高交互性能并减少数据库负载。缓存的设计将再次取决于数据的类型(只读、读/写和只读)。
这种方法将用户会话(UI 层概念)与数据管理分离,并提供支持共享使用缓存数据的额外好处(在数据在用户之间通用的情况下)。
【讨论】:
也不--不要“保留”任何东西!仅显示用户需要查看的内容并构建有效的分页方案以向后或向前查看行。
rp
【讨论】:
保持会话。如果需要,可以选择重新填充,例如,如果会话内存被擦除。
【讨论】: