2014-10-09 40 views
1

我创建了新闻网站MVC。 我有它的搜索功能。在这种情况下有什么更好的? ViewBag或TempData或Session?

SearchControllerIndexAction被调用,它获取记录从database,它返回Search View. 这个搜索查看有AJAX Pager寻呼,点击下一步或寻呼机上一个按钮时,AJAX请求到Search ControllerPaging Action制成。

现在我不想再打电话给我的Database。我想使用在Search ControllerIndex action期间获取的结果。

现在我已经使用Session[""]对象。

我想知道在这种情况下用于状态管理的更好。

结果从数据库中读取的可绕1000-5000,ArticleNameArticleShortDescription(〜200个字符)

回答

2

你不应该使用任何这些。会话是为每个用户创建的,如果您为每个使用您的搜索的用户存储1000 - 5000篇文章,那么您的时间将会很糟糕。 ViewData基本上是一个带有很好包装的Session对象,所以它对你的用例也不好。

假设您决定使用HttpRuntime。缓存,而不是每个用户的基础上的所有结果,然后你必须担心多久将对象存储在缓存中。

逻辑的做法是查询与分页数据库

为了防止打你的数据库如此频繁,那么你应该缓存与搜索词+页码+页的大小(选购),分页结果缓存键,并将结果对象存储为缓存值,理想情况下使用缓存过期集。 (你不想提供陈旧的搜索结果,直到你的缓存被驱逐出去吧?)

+0

所提到的那样当您说“使用分页查询数据库” ,我怎么知道有多少记录符合我的标准? – AK47 2014-10-09 08:39:49

+0

看看这个http://stackoverflow.com/a/18119680/670514 – 2014-10-09 08:40:57

+0

我知道这种方法,但什么好?要么带一个额外的列(只有一个值)或缓存在.Net端? – AK47 2014-10-09 08:44:40

2

ViewBagViewData或仅在当前请求持久的。因此,它们不可用。 TempData一直存在,直到下一个请求,但这可能是任何事情,所以不能保证它持续足够长的时间来进行Ajax调用(或后续的ajax调用)。

实际上,在这种情况下,Session是唯一不错的选择,但它仍然不是最佳选择。 您将存储批次的信息,甚至可能不会被客户请求。即使那样,在不再需要它时,清理它也可能很难。

最好的办法是打电话给数据库进行分页记录,这样你只能返回每个请求的数据子集,而不是仅仅拨出全部的数据。

+0

感谢您的回应,但我想避免再次调用数据库。仅从数据库中引入1页记录将阻止我应用分页原因,只有1页的记录将在那里,因此没有应用分页的意思。 – AK47 2014-10-09 08:32:55

+0

那么,在这种情况下,您必须为用户特定的数据使用'Session',或者针对全局/公共数据使用'Application Cache',正如@fordio – Kippie 2014-10-09 08:34:09

1

我避免使用会话状态,因为它会影响应用程序在负载平衡环境中的伸缩程度。您必须确保用户总是从同一台服务器获得请求,因为这是存储会话状态的地方(除非您将其放入数据库中,但会在您的情况下失败)。

我会尝试使用应用程序缓存。这意味着,如果用户单击“下一步”或“上一步”,并且该请求是从另一台服务器提供的,则必须再次访问数据库 - 但是我个人更倾向于选择该命中。

看看this page,特别向下滚动到应用程序缓存部分。

希望这会有所帮助。

相关问题