【问题标题】:Recommendation to load a value from database in cache to all the application建议将缓存中的数据库中的值加载到所有应用程序
【发布时间】:2012-04-22 06:12:07
【问题描述】:

我在数据库中有两个值,它们定义了我的应用程序中太多事物的行为,至少在不久的将来不会改变。创建静态变量并在我的应用程序的Global.asax 中加载值是最佳决定吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 caching


    【解决方案1】:

    一般规则是,当您知道您的值/数据将过期或在特定时间段后需要更改时使用缓存,否则使用静态变量。我发现了一个类似的讨论HttpRuntime.Cache[] vs Application[]
    另请查看ASP.NET Caching: Techniques and Best Practices

    【讨论】:

      【解决方案2】:

      是的,您可以将它们缓存在静态变量中。但是如果它们现在不需要更改并且保持不变,为什么不将它们定义为常量或在 web.config 中?

      【讨论】:

        【解决方案3】:

        我建议创建一个带有属性的静态类,这些常量设置将在您的应用程序启动时从数据库中设置其值。

        每当我有存储在数据库中的“系统”设置时,我都会做同样的事情。我将它们作为属性保存在一个静态类中,并一直访问它们。我还对不经常更改但经常使用以减少数据库流量的小表(即项目组)的内容使用相同的技术。我创建只读集合并访问它们,而不是一直访问数据库。

        但任何事情都是最适合您的问题,只要它干净且易于维护。

        【讨论】:

          【解决方案4】:

          我个人对我的 MVC 站点使用依赖注入(ninject 是我更喜欢的一种)。这允许您将变量定义为 .InSingletonScope,这意味着您不需要在应用程序中挂起令人讨厌的静态变量。然后,我在第一次请求时从数据库中加载值并将其存储在一个局部变量中,并且它非常整洁。

          我会用这个:

          public class CachedFooProperty : IFooProperty
          {
             public CachedFooProperty(IRepository<Foo> fooRepo)
             {
                Foo = fooRepo.GetFoo();
             }
             public Foo Foo{get;private set;}
          }
          

          然后像这样绑定它:

          Bind<IFooProperty>().To<CachedFooProperty>().InSingletonScope();
          

          这种做事方式的好处是,它真的很容易通过简单地更改绑定来打开和关闭缓存。您也可以非常轻松地将其更改为基于 web.config 的配置方法,而无需更改使用该设置的每个位置。

          【讨论】:

            猜你喜欢
            • 2013-08-30
            • 2021-09-28
            • 2021-09-13
            • 2011-02-09
            • 1970-01-01
            • 2020-06-27
            • 1970-01-01
            • 2019-07-20
            • 2018-04-23
            相关资源
            最近更新 更多