2011-11-04 39 views
2

好吧,我正在研究一个ASP MVC Web应用程序,它可以从SQL Server 2008查询相当大量的数据。应用程序启动时,用户会看到一个包含多个字段的搜索掩码。使用搜索掩码,用户可以搜索数据库中的数据,也可以通过在掩码中指定参数来过滤搜索。为了加速搜索,我将数据库查询返回的结果集存储在服务器会话中。在随后的搜索过程中,我可以搜索会话中的数据,从而避免不必要的访问数据库。在ASP MVC应用程序的服务器会话中存储大量数据的最佳选择是什么?

由于数据库查询可返回的数据量可能非常大,因此Web应用程序的可伸缩性受到严格限制。比方说,如果有100个用户同时使用该应用程序,那么服务器会为每个单独的用户在其会话中保留搜索结果。这最终会消耗相当多的记忆。我现在的问题是,在会话中存储数据的最佳选择是什么?数据库中的查询可能需要相当长的一段时间,因此目前我希望避免必须在后续搜索中运行查询,前提是已经检索到的数据包含正在搜索的数据。我考虑过的选项是在我的搜索查询中的数据库中创建一个临时表,用于存储检索到的数据以及可用于后续搜索的数据。问题是,我没有太多的SQL Server经验,所以我不知道如果有多个用户执行搜索,SQL Server是否会为每个用户创建临时表。还有其他的可能吗?可以使用SQL Server中的临时表进行工作,还是只会导致SQL Server上的内存问题?谢谢您的帮助! :)

编辑:非常感谢您的帮助和洞察力的答案,家伙!但是,我没有提到一个重要的细节。当我查询数据库时,结果集的格式可能因用户而异。这是因为用户可以通过从搜索掩码中的预定义多选框中选择列来决定结果表可以具有哪些列。如果用户A想要在他的结果表中显示ColA,ColB和ColC,他将从搜索掩码中的多选框中选择这些值。然而,用户B可能仅选择ColA和ColC。因此,将结果缓存到所有用户的单个表中可能会有点棘手,因为对于所有用户而言,表列不一定是相同的。因此,我在想,我几乎不得不使用另一种方法来单独保存每个用户的缓存表。下面提到的HTML5本地存储替代选项听起来很有趣。由于这是一个Intranet应用程序,因此假设(或要求)用户拥有支持HTML5的最新浏览器可能是公平的。你们有什么感想?再次感谢您的帮助:)

回答

1

如果您想要缓存查询结果,它们必须以某种形式存在于Web服务器或客户端上。所有选项都需要内存,并且由于搜索结果是用户特定的,因此内存使用量将随着当前用户数量的线性函数而增加。

我的建议是限制从SQL返回的行数(使用TOP)和/或查看优化SQL端的查询。如果您的数据库查询需要很长时间,那么很可能会在SQL中进行优化。

0

您可以尝试打开sql会话状态。

http://support.microsoft.com/kb/317604

:轻松,你会发现,如果这解决内存压力,并具有可接受的性能(即读取和写入缓存的DB)。如果perf是好的,那么你可能想要实现sql session自己做的事情,因为有一个... 下侧:如果你不来抢从会话中删除它,它就会被序列化和反序列化对页面无关每个请求。

1

你是否已经因子评分有关NoSql databases

一个NoSQL数据库的想法是来存储读取或写入优化,并且与“易查询”(例如在搜索字词查找)访问的信息。他们很容易横向扩展,并允许你搜索槽一大堆数据的速度非常快(例如想想谷歌的BigData的!)

+0

非常感谢您的提示。但是,我的产品是针对客户公司的,我无权更改其数据库。 – cbbcloud

1

如果HTML5是一种可能性,你可以使用本地存储。

+0

这听起来很有趣。是否有可能将整个.NET对象序列化为本地存储并将其“发送”给客户端,或者您是否必须在客户端使用JavaScript来完成它?你碰巧有一些链接或教程可以引用我吗?我还没有用过HTML5。 – cbbcloud

+0

我刚才读[这里](http://stackoverflow.com/questions/3220660/local-storage-vs-cookies),如果客户端需要频繁访问数据只能用于使用本地存储。然而,在我的场景中,服务器需要比客户端更多地使用数据。因此,Cookie可能比本地存储更适合。 – cbbcloud

+1

使用Cookie时,每个cookie只限制4MB,每个站点限制20个Cookie。你知道你会下拉多少数据吗?然后,您必须将这些更改保留回数据库,然后您必须担心并发性。您可以使用该框架来帮助您完成该任务。看看这个博客。 http://stephenwalther.com/blog/archive/2011/01/12/asp-net-and-html5-local-storage.aspx –

相关问题