在会话中缓存搜索结果与保持大型对象堆清洁

本文关键字:大型 对象 清洁 会话 缓存 搜索结果 | 更新日期: 2023-09-27 17:57:15

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

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

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

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

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

我知道这个问题有点不够明确。我刚刚意识到我的整体设计可能存在缺陷(w.r.t.可扩展性),我只是想估计到底有多大缺陷。我希望可以收集一些关于标准模式的提示,尽管如此,这仍然是一个普遍有用的问题。

在会话中缓存搜索结果与保持大型对象堆清洁

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

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

这里有2个商品教程

1)斯科特古的博客

2) 15秒教程

不知道您的查询是什么,但为什么要从数据库中提取比一次向用户显示的行多?有了好的索引,拉出后续页面应该非常快,然后你只需要在需要这些页面时才需要这样做。

另一种方法是仅保存 20000 个项的结果集 ID。这样,如果您需要翻阅它们,您可以通过主键快速拉出各个行。

最后,也许您应该考虑使用 Cache 对象而不是会话来存储结果。这样,您就可以让 .NET 决定何时释放对象,并且它们不会导致会话膨胀。

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

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

尝试像 Keltex 提到的那样对数据库进行分页,只提取您正在显示的数据。