Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在ASP MVC应用程序的服务器会话中存储大量数据的最佳替代方案是什么?_Sql Server_Asp.net Mvc - Fatal编程技术网

Sql server 在ASP MVC应用程序的服务器会话中存储大量数据的最佳替代方案是什么?

Sql server 在ASP MVC应用程序的服务器会话中存储大量数据的最佳替代方案是什么?,sql-server,asp.net-mvc,Sql Server,Asp.net Mvc,好的,我正在开发一个ASP MVC Web应用程序,它可以从SQLServer2008查询大量数据。当应用程序启动时,用户将看到一个包含多个字段的搜索掩码。使用搜索掩码,用户可以在数据库中搜索数据,还可以通过在掩码中指定参数来过滤搜索。为了加快搜索速度,我将数据库查询返回的结果集存储在服务器会话中。在随后的搜索过程中,我可以搜索会话中的数据,从而避免不必要的数据库访问 由于数据库查询可以返回的数据量可能相当大,因此web应用程序的可伸缩性受到严重限制。如果有100个用户同时使用该应用程序,服务器

好的,我正在开发一个ASP MVC Web应用程序,它可以从SQLServer2008查询大量数据。当应用程序启动时,用户将看到一个包含多个字段的搜索掩码。使用搜索掩码,用户可以在数据库中搜索数据,还可以通过在掩码中指定参数来过滤搜索。为了加快搜索速度,我将数据库查询返回的结果集存储在服务器会话中。在随后的搜索过程中,我可以搜索会话中的数据,从而避免不必要的数据库访问

由于数据库查询可以返回的数据量可能相当大,因此web应用程序的可伸缩性受到严重限制。如果有100个用户同时使用该应用程序,服务器将在其会话中为每个单独的用户保留搜索结果。这最终会消耗掉相当多的内存。我现在的问题是,在会话中存储数据的最佳替代方案是什么?数据库中的查询有时会花费相当长的时间,因此,目前,如果我先前检索到的数据包含现在正在搜索的数据,我希望避免在后续搜索中运行查询。我考虑的选项是在搜索查询中的DB中创建一个临时表,该表存储检索到的数据,并可用于后续搜索。问题是,我对SQL Server没有太多的经验,因此我不知道如果有多个用户执行搜索,SQL Server是否会为每个用户创建临时表。还有其他的可能性吗?在SQL Server中使用临时表的想法是否可行,还是只会导致SQL Server上的内存问题?谢谢你的帮助!:)


编辑:非常感谢你们提供的有帮助和有见地的答案,伙计们!然而,我没有提到一个重要的细节。查询数据库时,结果集的格式可能因用户而异。这是因为用户可以通过从搜索掩码中预定义的多选框中选择列来决定结果表可以包含哪些列。如果用户A希望在其结果表中显示ColA、ColB和ColC,则从搜索掩码中的multiselect框中选择这些值。然而,用户B可能只选择可乐和可乐。因此,为所有用户在单个表中缓存结果可能有点棘手,因为表columsn不一定对所有用户都相同。因此,我想,我几乎必须使用另一种方法来分别保存每个用户的缓存表。下面提到的HTML5本地存储替代选项听起来很有趣。由于这是一个内部网应用程序,因此可以公平地假设(或要求)用户拥有支持HTML5的最新浏览器。你们觉得怎么样?再次感谢您的帮助:)

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


我的建议是限制从SQL返回的行数(带TOP)和/或在SQL端优化查询。如果您的DB查询需要花费相当长的时间,则很有可能在SQL中对其进行优化。

您可以尝试打开SQL会话状态

Plus:轻松地,您将发现这是否修复了内存压力并具有可接受的性能(即,将缓存读写到数据库)。如果性能正常,那么您可能希望自己实现sql会话所做的事情,因为有一个。。。
缺点:如果您不急于将其从会话中删除,它将在不相关页面上的每个请求上被序列化和反序列化。

您已经考虑过了吗


NoSql数据库的思想是存储为读写而优化的信息,并通过“简单查询”(例如搜索词的查找)访问这些信息。它们可以轻松地水平扩展,并允许您快速搜索大量数据(例如,想想谷歌的BigData!)

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

谢谢你的提示。然而,我的产品是为一家客户公司提供的,我没有更改他们数据库的权限。这听起来很有趣。是否可以将整个.NET对象序列化到本地存储并“发送”到客户端,还是必须使用javascript在客户端执行此操作?你有没有一些链接或教程可以让我参考?我还没有使用HTML5,我只是读到只有当客户端需要频繁访问数据时才应该使用本地存储。然而,在我的场景中,服务器需要比客户端更多地处理数据。因此,cookie可能比本地存储更合适。使用cookie,每个cookie限制为4MB,每个站点限制为20个cookie。你知道你要收集多少数据吗?然后必须将这些更改保留回数据库,然后还要担心并发性。您可以使用该框架来帮助您完成该任务。看看这个博客。