【问题标题】:How to "cache" persistent settings in asp.net application如何在 asp.net 应用程序中“缓存”持久设置
【发布时间】:2013-02-02 02:52:47
【问题描述】:

我正在开发一个 asp.net 应用程序。在我的数据库中,我有一个“经典”单声道记录设置表。 每次我需要设置时,我都会写一些这样的代码

if ReturnSetting("my_setting") = value then
'do something
else
'do others
end if

在“ReturnSetting”中,我打开一个连接,获取设置值并返回它。 这效率不高(打开连接、数据读取器等)

我该如何优化呢?

谢谢

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    您可以编写一个变量并仅在第一个请求时填充它们。下一个请求将返回已填充的变量。

    public static class Settings
    {
        internal static Dictionary<string, object> _settingsCache = new Dictionary<string, object>();
        internal static Mutex _mutex = new Mutex();
    
        public static object Get(string key)
        {
            _mutex.WaitOne();
            if (_settingsCache[key] == null)
            {
                // add to the cache 
                _settingsCache.Add(key, NEW_DATA)
            }
            _mutex.ReleaseMutex();
            return _settingsCache[key];
        }
    }
    

    【讨论】:

    • 静态变量?在哪个级别?进入表格?进入 global.asax ?在哪里?
    • 如果两个请求同时出现,通过检查 _settingsCache[key] == null 并尝试从数据库中检索数据并将其保存到字典:) ?
    • 您可以使用互斥锁 (System.Threading) 来防止这种情况发生。我又改了答案
    • 最好将 _settingsCache.Add(key, NEW_DATA) 更改为 _settingsCache[key] = NEW_DATA。甚至更好地使用 Cache 类。
    • 互斥体也需要是静态的。
    【解决方案2】:

    我认为您可以在应用程序启动事件中编写对 Global.asax 文件上的函数的调用,以便从数据库中加载此数据一次并将结果放入应用程序对象中并更新您的“ReturnSetting”函数以检查应用程序对象,这将优化您的代码,以便数据库调用一次完成。

    注意如果这是全局网站设置,则此解决方案将有效工作,但如果它是用户设置,则您必须使用 global.asax 中的 Session Start 事件和将数据存储在其中的会话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2013-05-07
      相关资源
      最近更新 更多