ASP.NET缓存应用程序变量

时间:2010-06-24 14:45:19

标签: asp.net caching variables

我想知道使用应用程序变量进行缓存的替代方案。作为前言,我有一个自定义应用程序对象,它将所有应用程序数据存储在一个应用程序变量中 - 该对象在XML云中组织数据,并将云存储在一个变量中以提高性能。

我知道DataSet缓存,但我的所有DAL对象都选择(只读)数据读取器以提高性能,因此如果解决方案涉及DataSet,我需要进行大量的重构 - 不理想。记录数量低至中等,涉及网站数据和中小型项目管理应用程序;我们不是在说五十万条记录。

这是我打算在我的DAL类中使用的函数的结构(全选):

if (AppSetting.GetSetting(_CacheSettingName) == "")
    {
        SqlHelper objSqlHelper = new SqlHelper();
        XmlReader objReader = objSqlHelper.GetXmlReaderByCmd("Select * From FAQ FOR XML PATH('item'), root('" + _CacheSettingName + "')");

//load Cache       

        StringBuilder _xml = new StringBuilder();
        objReader.Read();
        while (objReader.ReadState != ReadState.EndOfFile)
        {
            _xml.Append(objReader.ReadOuterXml());
        }
        objSqlHelper.Dispose();
        AppSetting.SaveSetting(_CacheSettingName, _xml.ToString());
    }
    //we have cache loaded
    // now load the object list from the XML cloud from the application cache       
    List<FAQBLL> objFAQList = new List<FAQBLL>();
    FAQBLL objFAQ;
    XmlDocument oXmlDocument = new XmlDocument();
    oXmlDocument.LoadXml(AppSetting.GetSetting(_CacheSettingName));
    foreach (XmlNode oNode in oXmlDocument.FirstChild.ChildNodes)
    {
        objFAQ = new FAQBLL();
        objFAQ.ID = Convert.ToInt32(oNode.SelectSingleNode("ID").InnerXml);
        objFAQ.Question = oNode.SelectSingleNode("Question").InnerXml;
        objFAQ.Answer = oNode.SelectSingleNode("Answer").InnerXml;
        objFAQList.Add(objFAQ);
        objFAQ = null;

    }

    return objFAQList.Count > 0 ? objFAQList: null;

所以我的缓存将所有内容返回给调用proc,然后我LINK过滤对象(按活动,按位置)。在插入,更新和删除时,我有一行代码来清除缓存。同样,我的优点是使用只读数据读取器来提高性能,我的应用程序对象将XML组织到一个应用程序变量中。我的想法是,这是一个低开销,当我只是在读数据时不必丢弃数据集的数据读取器。

思考?意见?你受到了这种创伤吗?

1 个答案:

答案 0 :(得分:1)

是的,它有点创伤。将应用程序变量用作缓存的问题在于您丧失了缓存的一些最佳功能。例如,asp.net缓存提供了一些非常棒的缓存失效功能。这确保了a)缓存不会越来越多地占用越来越多的资源,以及b)缓存保持新鲜(例如,如果来自数据库)。

你应该考虑使用正确的工具来完成工作