6

好的,所以我在 ASP.NET 项目上工作了一段时间,似乎我做出了一些糟糕的设计选择,随着项目在包含的数据方面变得越来越大,这些选择又回来困扰着我。

在阅读了 .NET 内存管理之后,我想我已经确定了一整套潜在的原因。由于我正在做的事情并不是特别特别,我想知道是否有一个标准模式来实现我想要做的事情,而我却错过了。

所以我有一个(有点昂贵的查询),它产生的结果在 1 到 20000 之间。在后续请求中,我们可能只是对结果集进行分页,所以我将此结果存储在会话中。会话是 InProc。我在想:

  • a) 将结果 b) 存储在会话 c) 进程中是否有意义?我想要(a)的速度。我不知道是否有比由用户(b)存储它更有效的方法,如果我使用更复杂的状态服务器 - 它不是更慢(c)吗?或者这可能是解决方案,更快地处理这些大对象,而不是将最后一个结果集保存在 RAM 中直到会话到期?

  • 如果任何结果集 > ~ 20000 行最终可能会弄乱 LOH,是否有通用的方法来解决这个问题?

我知道这个问题的说明有些不足。我刚刚意识到我的整体设计可能有缺陷(wrt 可扩展性),我只是想估计到底有多大缺陷。我希望可以收集一些关于标准模式的提示,将其变成一个普遍有用的问题。

4

3 回答 3

1

为什么总是返回所有记录?我认为加快查询速度的最佳方法是只返回用户所需的数据。所以只有适合页面的数据!

尝试搜索 ROW_NUMBER() (SQL Server) 或 LIMIT (mySQL)。

这里有2个商品教程

1) ScottGu 的博客

2) 15 秒教程

于 2011-05-19T14:40:09.200 回答
1

Not knowing what your query is, but why would you pull more rows from your database than you need to show your user at one time? With good indexes, pulling up subsequent pages should be pretty quick and then you only need to do that if you need those pages.

An alternative is to just save the IDs of the resultset for the 20000 items. That way if you need to page through them, you can just pull up the individual rows quickly via a primary key.

Finally maybe you should consider using the Cache object to store your results rather than the Session. That way you let .NET decide when to dispose of objects and they don't result in a bloated Session.

于 2011-05-19T14:16:07.420 回答
1

您应该尽量避免将结果存储在会话中。如果用户在同一会话中使用多个浏览器选项卡,您的应用程序可能无法正常运行(这种情况发生了)。

如果您确实使用会话,则绝对不要使用 InProc 模式,因为随着用户的增长,进程会耗尽内存并最终回收,即使超时尚未过去,用户的会话也会丢失。

尝试使用数据库页面,因为 Keltex 提到只提取您正在显示的数据。

于 2011-05-19T14:28:43.513 回答