【问题标题】:ASP.NET MVC 2 - Avoiding repeatedly querying the database for static data?ASP.NET MVC 2 - 避免重复查询数据库中的静态数据?
【发布时间】:2011-04-03 15:55:53
【问题描述】:

如何避免在 ASP.NET MVC2 中每次加载页面时重复加载静态数据?这很浪费,我想解决它。

我的主页在右上角显示典型的用户名 + 公司名。但是由于 MVC 的无状态特性,每次加载页面时都必须查找这些数据,即使它永远不会改变。

在旧的 webforms 日子里,我只会把它扔到 Session 中,但在 MVC 中似乎不鼓励这样做。再加上网络应用程序在网络农场上运行,所以我真的不想使用会话。

Web 应用程序已经有相当多的静态数据项在每次页面加载时都会被查询(用户货币、用户税率等),所以我认为可以通过在登录时只加载一次来提高性能。我只是不确定正确的 MVC 方法是什么(我对 MVC 还是很陌生)。

【问题讨论】:

  • 看看在 .NET 中使用 ProfileProvider。在这些情况下工作得很好,创建您自己的配置文件提供程序来实现您现有的表/列并从那里开始。
  • 每次加载配置文件对象时,配置文件都会调用数据库吗?如果是这样,它不会改变任何东西。
  • 在 MVC 中使用(相对于 mis-使用)Session 没有任何问题。它是特定于浏览器实例的缓存。当你需要它时,使用它。只是不要在那里放任何与安全相关的东西,也不要认为它与登录有关。

标签: c# asp.net-mvc performance session caching


【解决方案1】:

我总是为此使用内置的 ASP.NET 缓存,适当地设置到期时间,一切顺利。

public void Blah()
{
    var company = HttpRuntime.Cache.Get("Company") as string;
    if (company == null)
    {
        company = FetchCompanyFromDb();
        HttpRuntime.Cache["Company"] = company;
    }

    return this.View(company);
}

另请参阅上一个问题:

Caching in asp.net-mvc

【讨论】:

  • 这在网络农场场景中的效果如何?我猜缓存是在内存中的?那么如果用户被从一个 web box 推送到另一个 web box,缓存就会消失?
  • 默认缓存是内存中的。通常每台机器请求一次该信息并没有那么糟糕 - 它仍然比以前少得多的查询。但是,假设这很难计算信息,因此请求需要很长时间。然后,您可以查看 Velocity 或 Memcached,它们是分布式缓存。这些都可以从 ASP.NET MVC 中使用,并且允许您共享缓存,但访问速度会比内存中的慢。
【解决方案2】:

您是否可以将您的用户货币/用户名/税等封装到用户控件中,然后对其使用输出缓存?

【讨论】:

  • 数据也需要在Controller中可用,所以这种方式可能行不通。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2019-03-09
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多