1

什么是可取的,将数据集保持在会话中或在每次回发时填充数据集?

4

11 回答 11

6

这将取决于许多因素。如果您的会话在进程中或在状态服务器上,通常最好不要在会话内存中保留太多项目,因为它的可扩展性较低。

如果您的会话驻留在数据库中,最好只重新查询并重新填充数据集,除非查询的执行成本很高。

于 2008-11-01T16:26:10.017 回答
5

不要使用会话!如果用户使用不同的请求打开第二个选项卡,则会话将被重用,结果将不是他/她期望的结果。您可以使用 ViewState 和 Session 的组合,但在诉诸缓存之前,您仍然可以测量在没有任何类型缓存的情况下您可以处理多少。

于 2008-11-04T01:18:36.587 回答
2

这取决于您将执行此操作的程度以及会话数据在服务器上的存储位置。

将数据集保持在会话中肯定会影响内存使用。所有会话变量都存储在内存中,如果您使用 SQL Server 状态,则存储在 SQL Server 中。您还可以使用 State Server 模式将负载卸载到另一台机器上。

序列化/反序列化方面。如果你使用非常大的数据集,它可能会严重影响服务器的 seide 性能。

另一方面,在页面上拥有非常大的视图状态可能会成为真正的性能杀手。因此,我会将数据集保存在会话或缓存中,并寻找一种“outproc”方式来存储该会话数据。

于 2008-11-01T16:27:20.670 回答
2

由于我希望尽可能少的数据库操作,我会将数据保留在会话中,但我不确定什么是最好的方法。我如何处理并发,并且由于两个用户同时使用页面时共享数据,我如何确保他们每个人在会话中都有自己的数据集?

于 2008-11-01T16:47:25.013 回答
1

如果它不是太大和/或数据库又远又慢,我通常会保持它在会话中。如果数据很大,一般情况下最好重新加载。

有时我使用缓存,我第一次从 Db 加载并将其放入缓存中。在回发期间,我检查 chache,如果它是空的,我会重新加载。所以服务器自己管理缓存。

于 2008-11-01T16:28:06.080 回答
1

会话的问题在于,如果它在 proc 中,它可能会消失,这不是很好,如果它是状态服务器,那么你必须序列化,如果它是 sql,那么你无论如何都要进行往返!

如果结果集很大,请执行自定义分页,以便您只返回总结果的一小部分。

然后,如果您认为多个用户会看到此结果集,请将每个页面作为用户页面放入缓存中,确保在数据更改或一段时间未访问时更新缓存。

如果您不想进行多次往返,并且您认为您已经拥有内存,那么将整个数据集放入缓存中,但要小心它不会破坏 Web 服务器。

使用缓存意味着用户不需要自己的数据集,而是使用全局集。

就并发性而言,当您加载插入/编辑页面时,您需要用新数据填充它并在添加/更新后更新缓存。

于 2008-11-01T17:00:41.180 回答
1

我非常相信解耦,而且我很少(如果有的话)认为需要将完整的数据集扔到用户界面上。

您实际上应该只将对象传递给需要使用的 UI,因此除非您显示大图或某种需要显示数据之间关系的数据结构,否则不值得付出代价。

如果适用,较小的数据子集效率要高得多。您的应用程序实际上是否使用了 UI 数据集中的所有功能?如果没有,那么最好的方法是只传递您正在显示的数据。

如果您将数据绑定到控件并通过它进行排序/分页等,您可以在更小的代码中实现许多使数据集能够支持这一点的接口。

关于这一点,我会在缓存中保留大部分静态的数据(例如,它不会经常更新)。因此,您需要查看数据的更新频率,然后才能真正做出决定。

最后,我再说一遍,我认为在 UI 中使用数据集的需求非常非常少。它是一个非常繁重的数据对象,查看数据需求的成本效益与实施的简易性相比,可能远远不够超过缓存数据集的需要。

恕我直言,如果您担心性能或内存利用率,那么使用数据集是相当糟糕的。

于 2008-11-02T22:41:48.930 回答
1

您的回答并未暗示数据的使用。是参考数据吗?用户是否在积极更新它?是否意味着不止一位用户在任何时候都具有更新访问权限?

如果没有比您提供的更好的信息,请遵循公认的观点,即在会话中保留大量数据是一种保证您的应用程序不会扩展并且需要大量资源来为少数人服务的方法。

通常有更好的方法来管理大型数据集,而无需将所有数据加载到内存中。

如果做不到这一点,如果您的应用程序数据需求真的很庞大,那么请考虑使用带有 Web 服务后端的重型客户端。它可能比制作网页更适合。

于 2008-11-03T01:27:03.183 回答
1

正如其他答案所指出的,答案“取决于”。但是,我假设您正在谈论用户之间共享的数据。在这种情况下,您不应数据集存储在用户会话中,而应在回发时重新填充。

此外,您应该在应用程序的数据访问层附近填充缓存,以提高交互性能并减少数据库负载。缓存的设计将再次取决于数据的类型(只读 vs. 读/写 vs. read-mostly)。

这种方法将用户会话(UI 层概念)与数据管理分离,并提供支持共享使用缓存数据的额外好处(在数据在用户之间通用的情况下)。

于 2008-11-04T01:43:14.913 回答
0

保持会话。如果需要,可以选择重新填充,例如,如果会话内存被擦除。

于 2008-11-01T16:22:01.490 回答
0

也不——不要“保留”任何东西!仅显示用户需要查看的内容并构建有效的分页方案以向后或向前查看行。

rp

于 2008-11-01T16:27:35.037 回答