【问题标题】:'Caching' a large table in ASP.NET在 ASP.NET 中“缓存”一个大表
【发布时间】:2011-02-21 10:53:54
【问题描述】:

我了解每次页面刷新,尤其是在“AjaxLand”中,都会导致我的后端/代码隐藏类从头开始调用...这是一个问题,因为我的类(它是 System. Web.UI.Page)包含大量来自数据库的数据。因此,现在 AjaxLand 中的每次页面刷新都会导致我进行大型后端数据库调用,而不仅仅是重用内存中的类对象。有什么解决办法吗?这是会话变量发挥作用的地方吗?会话变量是我必须在内存中保留与单用户和单会话实例相关联的对象的唯一选择吗?

【问题讨论】:

  • 每次页面刷新都会导致页面被(重新)评估,无论是否使用 AJAX。您的 AJAX 代码不应该刷新整个页面,它应该重新使用相关数据在客户端(即不作为 [服务器] 内存中的 .NET 对象)。

标签: c# asp.net asp.net-ajax


【解决方案1】:

如果您的数据是特定于用户的,那么Session 将是您的最佳选择。如果您有网络农场或网络花园,请小心。在这种情况下,您的会话需要一个会话服务器或数据库。

如果您的数据是应用程序级别的,那么Application Data Cache 可能是要走的路。如果您的 RAM 有限且数据量很大,请小心。缓存可能会在不合时宜的时候自行清空。

无论哪种方式,您都需要测试您的应用程序在更改后的执行情况。您甚至可能会发现返回数据库是最不坏的选择。

此外,您可以查看Lazy Loading 的一些数据,以减轻其负担。

【讨论】:

    【解决方案2】:

    既然你提到了 Ajax,我想你可能需要考虑以下几点:

    假设这个大数据集是静态的而不是瞬态的,在第一次调用 Ajax 时,您的应用程序会查询数据库,检索大量数据并返回给客户端(即浏览器/浏览器上运行的 JavaScript 等),客户端现在已经在内存中拥有所有这些。随后,无需返回服务器获取客户端已在内存中的相同数据。您需要做的是使用 JavaScript 来重建 DOM 或其他任何东西。从现在开始,一切都可以在客户端上完成。

    现在假设数据不是静态的而是瞬态的,通过将它们缓存在服务器上的会话无论如何都不是您想要的解决方案。每次您的客户端向服务器发送请求,而服务器只返回缓存(会话)中的内容时,数据已经过时,并且与客户端已经在内存中的数据没有区别。

    关键是如果数据是静态的,一旦内存中已有数据,就保存到服务器的往返行程。如果数据是瞬态的,恐怕没有便宜的解决方案,只能以某种方式重新查询或重新检索数据,然后将所有内容发送回客户端。

    【讨论】:

      【解决方案3】:

      你需要ASP.Net Caching

      特别是Data Caching

      【讨论】:

        【解决方案4】:

        看看这个关于 ASP.NET 的各种缓存机制的 MS article。您可能会感兴趣的部分名为“在服务器内存中缓存任意对象”。

        【讨论】:

          猜你喜欢
          • 2012-08-06
          • 2013-08-16
          • 2014-03-29
          • 2011-02-25
          • 1970-01-01
          • 1970-01-01
          • 2010-12-26
          • 2010-12-29
          • 1970-01-01
          相关资源
          最近更新 更多