1

考虑我的数据表包含 10,000 行,我想知道将数据表存储在会话变量中的陷阱......我想使用它,直到添加了新行......

我应该使用什么类型的会话模式?

4

4 回答 4

0

有了这么大的数据集,我真的不认为你应该将它存储在会话或视图状态中。以 SQL 状态存储也会产生巨大的读写开销。存储在内存会话中会显着影响您的工作进程内存使用情况。存储在 ViewState 中更糟糕,因为由于页面大小以及对视图状态进行编码和解码所花费的时间,它会使页面加载非常缓慢。

如果你真的必须这样做,我会在记忆会议中选择所有选择并付出代价。否则,我认为您应该考虑重构代码,而不必缓存该大小的数据表并根据需要在集合/页面中提取数据。或者,如果您有分层架构,让您的应用程序代码缓存它,并且当发出请求时,应用程序代码可以在需要时提取记录/子集并将其返回给 UI。

于 2010-02-24T05:14:52.317 回答
0

永远不要这样做,不建议这样做。如果您的服务器内存不足且处理时间繁忙,则会影响性能。

在进行此操作之前,您需要考虑

  1. 你的服务器有可用内存吗?
  2. 你的服务器有多忙?
  3. 您要放入会话的数据是否将在多个用户请求之间共享?

为什么要将这么多数据存储到会话中。可能您这样做是为了分页(在我假设的数据网格中),那么您必须重新考虑您的设计。

于 2010-02-24T05:36:10.620 回答
0

如果您需要整个用户会话中的数据,那么将其存储在 Session 中是很好的。但在您的情况下,您可以选择 ViewState 或 Cache。你可以存储在 ViewState 中更好。

ViewState["Table"] = ds.Tables[0];

取回它,

数据集 ds=新数据集();ds = (DataSet)ViewState["Table"];

  1. 如果在分配之前读取会话变量或当前会话超时,则会导致 NullReferenceException,因为在读取会话变量之前不会进行空值检查。
  2. 没有简单的方法来跟踪会话变量的使用情况、它们的键名、它们的数据类型、每个会话使用的大致内存等。

但是请记住将 DataSet 放在 ViewState 中的一件事会增加页面加载。

**

执行您要求的最有效方法是将数据库返回的数据集转换为通用列表,然后使用会话来保存列表。List 将比会话中的 Dataset 花费更少的内存。

**

于 2010-02-24T05:06:39.307 回答
0

首先,您真的需要在会话级别存储那么多数据吗?您能否在应用程序级别(缓存对象)存储更多内容。

如果您有一个场,即不止一个 iis 服务器,那么您将不得不使用内存缓存或 sql 缓存。使用大 blob,内存缓存会更快。如果它在该服务器内存中的单台计算机上可以工作。

我会认真考虑重构问题。能否引入分页或其他形式的数据窗口以减少数据量?

于 2010-02-24T05:07:22.607 回答