zoukankan      html  css  js  c++  java
  • 缓存记录

     

            #region ¤¦Ì?oä?广??À¨ª

            /// <summary>

            /// ¤¦Ì?oä?广??À¨ª

            /// </summary>

            /// <returns></returns>

            public static DataTable GetAdTable()

            {

     

               //CacheHelper.ClearCache();

     

                DataTable dt = null;

     

                string keyName = "Advert";

     

                dt = (DataTable)CacheHelper.GetCache(keyName);

     

                if (null==dt)

                    {

                        dt = db.GetTable("SELECT AdID,AID,AdTarget,AdWidth,AdHeight,AdNum,AdDes,ADType FROM [dbo].[Advert]");

     

                        CacheHelper.AddCache(keyName, dt);

                    }

                 

                

               

                   

     

                    return dt;

               

            }

     

            #endregion

     

     

     

            #region ¤¦Ì?°??广???Ì??¤?¨¤®|?¡é

            /// <summary>

            /// ¤¦Ì?°??广???Ì??¤?¨¤®|?¡é

            /// </summary>

            /// <param name="Aid">广???ID</param>

            /// <returns>°??广????¨®</returns>

            public static AdvertModel GetAdModel(int Aid)

            {

     

                AdvertModel tmpModel = null;

     

               

     

                try

                {

     

     

     

     

     

                    DataRow dr = GetAdTable().Select("AID="+Aid)[0];

     

                    if (dr != null)

                    {

                        tmpModel = new AdvertModel();

                        tmpModel.AdID = DBNull.Value.Equals(dr["AdID"]) ? 0 : (int)dr["AdID"];

                        tmpModel.AdHeight = DBNull.Value.Equals(dr["AdHeight"]) ? 0 : (int)dr["AdHeight"];

                        tmpModel.AdNum = DBNull.Value.Equals(dr["AdNum"]) ? 0 : (int)dr["AdNum"];

                        tmpModel.AdTarget = DBNull.Value.Equals(dr["AdTarget"]) ? "_bank" : dr["AdTarget"].ToString();

                        tmpModel.AdWidth = DBNull.Value.Equals(dr["AdWidth"]) ? 0 : (int)dr["AdWidth"];

                        tmpModel.ADType = DBNull.Value.Equals(dr["ADType"]) ? 0 : (int)dr["ADType"];

                    }

                }

                catch (Exception e)

                {

     

                }

              

     

     

                return tmpModel;

     

     

     

            }

            #endregion

     

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Web.Caching;

    using System.Web;

     

    namespace Pad.Common

    {

       public class CacheHelper

        {

     

          // private static CacheItemRemovedCallback callback = new CacheItemRemovedCallback(CacheItemCallBack);

     

     

     

           public static AggregateCacheDependency GetDependency(string dependencyKey)

           {

               AggregateCacheDependency dependency = new AggregateCacheDependency();

               string[] tables = System.Configuration.ConfigurationManager.AppSettings[dependencyKey].Split('-');

               foreach (string table in tables)

               {

                   dependency.Add(new SqlCacheDependency("mypads", table));

     

               }

     

               return dependency;

           }

     

     

     

           /// <summary>

           /// ¨¹¦ÌÀ¨ª

           /// </summary>

           public static List<string> cacheKeyList = new List<string>();

     

     

     

           /// <summary>

           /// ®¨¦¨¹¦Ì¤¦Ì?oä??¨®

           /// </summary>

           /// <param name="keyName">¨¹¦Ì</param>

           /// <returns>oä??¨®</returns>

           public static object GetCache(string keyName)

           {

               if (string.IsNullOrEmpty(keyName)) return null;

               return HttpRuntime.Cache.Get(keyName);

           }

     

     

                 //<summary>

                 // oä??¨®

                //</summary>

                 //       <param name="keyName">¨¹¦Ì</param>

                 //<param name="value">?¨®</param>

                 //<param name="dependency">°¨¤¤¦Ì¡¥?</param>

           public static void AddCache(string keyName, object value,AggregateCacheDependency dependency)

           {

     

               if (string.IsNullOrEmpty(keyName) || null == value) return;

     

               if (!cacheKeyList.Contains(keyName)) cacheKeyList.Add(keyName);

     

               HttpRuntime.Cache.Add(keyName, value, dependency, DateTime.Now, TimeSpan.Zero, CacheItemPriority.Normal,null);

           }

     

     

           /// <summary>

           ///   oä??¨®

           /// </summary>

           /// <param name="keyName">¨¹¦Ì</param>

           /// <param name="value">?¨®</param>

           /// <param name="dependency">°¨¤¤¦Ì¡¥?</param>

           public static void AddCache(string keyName, object value)

           {

     

     

               if (string.IsNullOrEmpty(keyName) || null == value) return;

     

               if (!cacheKeyList.Contains(keyName)) cacheKeyList.Add(keyName);

     

               SqlCacheDependency sqlDependency =null;

     

               string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString;

     

     

               try

               {

                   sqlDependency = new SqlCacheDependency("mypads", keyName);

               }

               catch (DatabaseNotEnabledForNotificationException ex)

               {

     

                   Logs("A¡é"+ex.ToString()+ex.Message);

     

                   try

                   {

                        //string connStr = @"Data Source=tangself\SQLEXPRESS;Initial Catalog=pads;Integrated Security=SSPI";

     

                       SqlCacheDependencyAdmin.EnableNotifications(connStr);

                   }

                   catch ( UnauthorizedAccessException e)

                   {

     

                       Logs("B¡é" + e.ToString() + e.Message);

                   }

               }

               catch (TableNotEnabledForNotificationException ec)

               {

     

                   Logs("C¡é" + ec.ToString() + ec.Message);

     

                   try

                   {

                       //string connStr = @"Data Source=tangself\SQLEXPRESS;Initial Catalog=pads;Integrated Security=SSPI";

                       SqlCacheDependencyAdmin.EnableTableForNotifications(connStr, keyName);

     

                   }

     

                   catch (System.Data.SqlClient.SqlException ex)

                   {

     

                       Logs("D¡é" + ex.ToString() + ex.Message);

     

                   }

     

               }

     

               finally

               {

     

                   HttpRuntime.Cache.Add(keyName, value, sqlDependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

     

     

               }

     

     

     

     

              

     

           }

     

     

           /// <summary>

           /// °?¨£¤oä??¨®

           /// </summary>

           /// <param name="keyName">¨¹¦Ì</param>

           public static void RemoveCache(string keyName)

           {

               if (cacheKeyList.Contains(keyName)) cacheKeyList.Remove(keyName);

               HttpContext.Current.Cache.Remove(keyName);

           }

     

     

           /// <summary>

           /// ?yoä?

           /// </summary>

           public static void ClearCache()

           {

               foreach (string keyName in cacheKeyList)

               {

                   HttpContext.Current.Cache.Remove(keyName);

     

                  

               }

     

               cacheKeyList.Clear();

           }

     

           public static void Logs(string res)

           {

              

               string path = AppDomain.CurrentDomain.BaseDirectory+ "\\logs.txt";

               if (!System.IO.File.Exists(path))

               {

                   System.IO.File.Create(path);

               }

     

               // System.Web.HttpContext.Current.Response.Write("aaaaaaaaaa");

     

               System.IO.FileStream fs = System.IO.File.Open(path,System.IO.FileMode.Append);

     

     

               byte[] str = System.Text.UnicodeEncoding.GetEncoding("db2312").GetBytes(DateTime.Now.ToString() + "\r\n" + res + "\r\n");

     

               fs.Write(str, 0,str.Length);

     

               fs.Close();

     

              // //res.ToString();

     

           }

        }

    }

     

    SqlCacheDependency数据库缓存依赖。

    实现步骤:

        下面就让我们看一下如何实现数据库缓存依赖功能:

    第一步: 修改web.config,让项目启用SqlCacheDependency

    将下列代码加入web.config<system.web>节:        

            <caching><sqlCacheDependency enabled="true" pollTime="6000">

                    <databases><add name="codematic" connectionStringName="strcodematic" /></databases>

               </sqlCacheDependency></caching>

    这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字,这个名字将在第3步中用到。
    SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。

    注意:在<databases>节的<add name="codematic" connectionStringName="strcodematic" />中的name属性值必须System.Web.Caching.SqlCacheDependency("codematic", "P_Product"); 中的第一个参数(数据库名称)相一致。
    第三步:在代码中使用缓存,并为其设置SqlCacheDependency依赖:

       

    public static object GetCache(string CacheKey){

        System.Web.Caching.Cache objCache = HttpRuntime.Cache;

        return objCache[CacheKey];

    }

    public static void SetCache(string CacheKey, object objObject, CacheDependency dep){

        System.Web.Caching.Cache objCache = HttpRuntime.Cache;

        objCache.Insert(CacheKey,objObject,dep,Cache.NoAbsoluteExpiration,

           Cache.NoSlidingExpiration, CacheItemPriority.Default,null);

    }

    protected void Page_Load(object sender, EventArgs e){

        string CacheKey = "cachetest";

        object objModel = GetCache(CacheKey);//从缓存中获取

        if (objModel == null){

            objModel = GetData();//把当前时间进行缓存

            if (objModel != null){

              SqlCacheDependency dep = new SqlCacheDependency("codematic", "P_Product");

                SetCache(CacheKey, objModel, dep);//写入缓存

    }

    //查询数据

    private DataSet GetData(){}

         从以上代码可以看出,和文件依赖基本相同,只是在存放缓存SetCache时存入的依赖对象不同罢了。这里用的是SqlCacheDependency。其中,创建SqlCacheDependency的构造方法:

    public SqlCacheDependency (string databaseEntryName,string tableName)

    databaseEntryName :是在Web.config 文件的 caching 节的 sqlCacheDependency databases 元素中定义的数据库的名称。

      tableName :与 SqlCacheDependency 关联的数据库表的名称。

        这样,只有当P_Product表的内容发生变化时,查询操作才会重新查询数据更新缓存的内容,可以大大减少数据库的重复查询和提高系统的性能和运行效率。

    采用SQLServer2005 BrokerSqlDependency类来提供数据更改通知(原创)

           SQLServer2005中,SQL Server Service Broker 用于创建会话以交换消息。 消息交换在目标和发起方这两端之间进行。

           使用 SqlDependency 订阅查询通知是直接的:SqlDependency 对象将管理数据库中设置通知涉及到的复杂性。建立通知后,对象便会监视实现通知的基础数据库对象,当 SQL Server 创建查询通知时,将在应用程序中调用事件处理程序。

           对于应用程序接收SQL Server Service Broker通知,只能获取到对应数据库表数据做了何种更新,而无法获取更新的数据,而我们却可以利用这个通知,来做缓存依赖,来达到缓存过期的目的。

           使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀),

    例如:select * from table1select column1 from table1select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。

           以下以一个实际的例子(sqlDep项目)来说明如何使用ServerBrokerSqlDependency类来做缓存依赖,充分利用服务器资源和提高应用程序性能,并且封装以提供给开发人员最大的便利性,我们需要按照如下步骤操作:

    1.     首先要在使用的数据库执行 ALTER DATABASE AdventureWorks SET ENABLE_BROKER 以启用该功能,执行时必须关闭所有可能锁表的操作和作业。

    2.     打开sqlDep示例,运行ServiceBrokerTest.aspx以查看结果,查看代码。

    3.     在现有应用程序中增加更改通知以及缓存机制。

    a)      webconfig<configuration>节中添加<connectionStrings>节,并配置连接字符串。

    b)      webconfig<system.web>节中添加

    <caching>

    <cache percentagePhysicalMemoryUsedLimit="60" privateBytesPollTime="00:05:00" />

    </caching> (此项配置全局缓存设置,可选)

    c)      建立数据访问层,如何封装编写不限,只要具有返回数据的方法即可。

    d)      嵌入或者重写DaBase.cs中的protected virtual DataTable GetDataTable方法,具体请参考sqlDep示例,该方法提供自动响应程序表发生的更改,自动设定缓存机制,封装此方法后,对于开发人员,只需要按照以往开发习惯提供任意sql语句编写程序获取数据。

    e)      继承DaBase类或自己编写具有protected virtual DataTable GetDataTable方法的类,并调用该方法,参见DaDimCustomer.cs

    以下我们以sqlDep做测试,以验证可行性及其性能:

    我们以SqlServer2005自带的AdventureWorksDW数据库中的DimCustomer表为例,该表有29列,各种数据类型都有,18484行,7984KB数据,平均每行0.43KB

    我们以每次查询20页,查询该表的所有列作为测试。由于缓存的是查询结果,所以内存变化可以根据每次查询的数据量为基准,20行大小大约是8.6KB,缓存默认设置是允许使用服务器内存的90%

    假设对应的数据库表不做更新操作,假设Web服务器有1G的内存可使用缓存,

    则可以缓存12万份不重复结果(这里没有计算.net本身每个数据实体,每个缓存相关数据所占有的空间,相对于数据而言可以忽略不计)

    缓存命中率大都集中在常用查询,例如商品列表第一页,某个商品分类第一页等,一旦有某个用户使用了查询,则其他用户可以不需要访问数据库即可得到所需数据。即使缓存如果超过了程序规定的最大数据,.net运行时也会自动随即清空缓存,这并不影响程序运行。

          SQL Server 2005上执行

    ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;语句让相应的数据库启用监听服务,以便支持SqlDependency特性。

    3.编写global.asax文件,启动监听sql2005通知事件.

    Application_Start 中:

    string connStr =System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

                System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(connStr);

                string[] tables = System.Configuration.ConfigurationManager.AppSettings["CacheTables"].Split('-');

                foreach (string table in tables){

                    System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(connStr, table);

                }

                System.Data.SqlClient.SqlDependency.Start(connStr);


     void Application_End(object sender, EventArgs e){         

    System.Data.SqlClient.SqlDependency.Stop(System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString);

            }

    4.编写数据访问代码.创建一个EmployeeData的类,代码如下

     public class EmployeeData{ 

         private HttpContext context;

         public DataSet GetCacheData(){

             context = HttpContext.Current;

             DataSet cache =(DataSet) context.Cache["employee"];

             if (cache == null){return GetData();}

             else{return cache;}

         }

         public DataSet GetData(){

            

             adp.Fill(ds);

             context.Cache.Add("employee", ds, dep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, new CacheItemRemovedCallback(this.DataDiff));

             return ds;

         }

         public void DataDiff(string key, object value, CacheItemRemovedReason reason){

             Console.WriteLine("key:" + key);

             GetData();

         }

     }

    这里需要注意的是 select语句的写法, 不能使用 select *  的方式,一定要在表名前加架构名称 如我们这里的 dbo.employee.

    SQL SERVER 7.0/2000/2005版本

    正文

    一、SQL SERVER 7.0/2000SQL SERVER 2005的简介及比较

    1.1 SQL SERVER 7.0/2000

    SQL SERVER 7.0/2000没有提供内置的支持数据缓存依赖的功能,所以只能通过采用添加特定数据库表、触发器等方式,通过后台不断轮询数据库来检查数据更改。当在数据表上执行INSERTUPDATE DELETE操作时将自动发出更改通知,所以只能监测到表级,具体到哪一行是没法跟踪的。

    使用方法步骤:

    1.1.1 使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库。

    1.1.1.1 ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;

    aspnet_regsql -S <server> -U sa -P sa -d <database> -ed 启动数据库的数据缓存依赖功能

    aspnet_regsql -S <server> -U sa -P sa -d <database> -t <table> -et 启动数据表的数据缓存依赖功能

    1.1.1.2

    SqlCacheDependencyAdmin.EnableNotifications(connectionString); //启动数据库的数据缓存依赖功能

    SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString,table); //启用数据表缓存

    推荐这段代码写在Global.asaxApplication_Start方法中,以便应用程序启动的时候就启用数据库和数据表的缓存依赖功能。

    1.1.2 配置Web.config

    <sqlCacheDependency enabled="true" pollTime="10000">配置在<sytem.web>下的<caching>结点下,只有一个数据库的话不必指定下一级<database>结点

    1.1.3 应用程序数据缓存中使用(还可以在数据源控件、输出缓存整个页面时使用,这里就不介绍了,下同)

    SqlCacheDependency scd = new SqlCacheDependency("数据库名称","表名");

    Cache.Insert(...,scd,...);

    1.2 SQL SERVER 2005

    内置支持SQL数据缓存依赖,内置通知传递服务,能够提供更小粒度的数据更改监测,使用和配置简单。

    使用方法步骤:

    1.2.1 检测是否已经启用Service Broker

    Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled') -- 1 表示已经启用 0 表示没有启用

    这个地方我看有些朋友翻译的成“是否能启用”,这是不对的,这里我把英文原文帖出来:“This can be checked by calling "Select databasepropertyex('db Name', 'IsBrokerEnabled')". A '1' means that the broker is enabled. A '0' means that the broker is not enabled. ”。

    依据我的经验,如果直接在当前SqlServer2005上新建一个数据库的话,默认是打开的,如果是从其他地方数据库导过来的,导入之后默认关闭了。(可能有不准确,大家可以自己试验一下测试一下)。如果已经打开可直接调到1.2.2

    1.2.1.1 启用Service Broker

    ALTER DATABASE 数据库名称 SET ENABLE_BROKER;

    2009-5-26补充: 如果执行此语句超过10秒或处于假死状态,请重启数据库,什么都别做先执行这个语句就行了!

    1.2.2 在实现基于服务的SQL数据缓存依赖过程中,需要显式调用SqlDependency.Start来启动接受依赖项更改通知的侦听器。

    SqlDependency.Start(connectionString); //推荐将这段代码加到Global.asaxApplication_Start方法中,

    SqlDependency.Stop(connectionString); //用于关闭,可加在Global.asaxApplication_End方法中。

    1.2.3 应用程序数据缓存中使用

    SqlCommand cmd = new SqlCommand(sql,conn);

    SqlCacheDependency scd = new SqlCacheDependency(cmd);

    Cache.Insert(...,scd,...);

    注意:

    a). 必须设置完全限定名称的数据表。即表名前面需要加所有者,如dbo.test

    b). 必须明确设置所访问数据库列名称,不能使用“*”。

    c). 必须保证不是聚合函数。如COUNTMAX等。

    1.3 比较、区别

    SQL SERVER 7.0/2000

    SQL SERVER 2005

    实现机制

    轮询

    通知传递服务(Service Broker)

    是否需要配置启用

    需要

    不需要,内置支持

    数据更改检测

    限于表级更改监测

    表级、行级更改监测

    并且很明显,SQL SERVER 2005的缓存机制更加高效。另外,SqlCacheDependency类还特别结合SQL SERVER 2005 进行了优化:

    a). 使用SQL SERVER 2005 时,SqlCacheDependency类支持与System.Data.SqlClient.SqlDependency类进行集成。应用程序可创建SqlDependency对象,并通过OnChanged事件处理程序接受通知进行注册。这样,应用程序不仅可以使用Sql server 2005的查询通知机制来监测使用SQL查询结果无效的数据更改,并将缓存对象从缓存中移除,而且还可以轻松获取数据更改通知,以便刷新缓存。(从这里可以看出,当触发onRemoveCallback委托的时候,数据已经从缓存里面删除了,这样一来可以手动在委托里面添加缓存,或者干脆设置成null,让他下次调用的时候再缓存。)

    b). 不仅向应用程序添加缓存依赖项,还可以与@OutputCache指令一起使用,以生成依赖于SqlServer数据库表的输出缓存的页面或用户控件。对于用户控件,@OutputCache指令不支持使用SQL SERVER 2005 的查询通知(onRemoveCallback委托)

    二、System.Web.Caching.Cache InsertAdd区别

    2.1 Add方法

    object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

    2.2 Insert方法

    void Insert(string key, object value);

    void Insert(string key, object value, CacheDependency dependencies);

    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);

    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);

    void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);

    2.3 比较、区别

    a). Insert方法支持5种重载,使用灵活,而Add方法必须提供7个参数;

    b). Add方法可以返回缓存项的数据对象,Insert 返回Void

    c). 添加重复缓存情况下,Insert会替换该项,而Add方法会报错。

    三、 CacheDependencyAggregateCacheDependencySqlCacheDependency

    3.1 CacheDependencyAggregateCacheDependencySqlCacheDependency的父类。主要用于在应用程序数据缓存对象与文件、缓存键、文件或缓存键的数组或另外一个CacheDependency对象之间建立依赖关系。CacheDependency监视依赖关系比便在任何对象更改时自动移除缓存对象。CacheDependency可以监测一组(到文件或目录的)文件路径的更改情况。

    3.2 AggregateCacheDependency主要用于实现聚合缓存依赖。如一笔数据同时对两个表进行缓存依赖,一旦其中任何一个表数据更改缓存将失效。

    3.3 SqlCacheDependency将应用程序数据缓存对象、页面输出缓存、数据源控件等与指定SQL Server数据库表或Sql Server 2005 查询结果之间建立缓存依赖关系,在表发生更改(Sql Server 2005 行级别更改)时,自动从缓存中删除和重新添加与该表关联的缓存对象。一般而言:

    SqlCacheDependency (SqlCommand) 用于SQL SERVER 2005

    SqlCacheDependency (数据库名, 表名) 用于SQL SERVER 7.0/2000

    使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀),

    例如:select * from table1select column1 from table1select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。


    使用步骤

    为数据库开启SqlCacheDependency功能

    方法1:使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库。

    aspnet_regsql -S SQL服务器名 -E -d 数据库 -ed      启动数据库的数据缓存依赖功能

    我们还需要对相关的数据表执行aspnet_regsql命令,如:
    aspnet_regsql -S SQL服务器名 -E -d 数据库 -t 表名 -et 多个表就多次执行这句话

    方法2

    SqlCacheDependencyAdmin.EnableNotifications(connectionString);      //启动数据库的数据缓存依赖功能                    

    SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table);         //启用数据表缓存

    推荐这段代码写在Global.asaxApplication_Start方法中,以便应用程序启动的时候就启用数据库和数据表的缓存依赖功能。

    配置Web.config

    <!--缓存配置-->
          <caching>
          <!--pollTime为查询数据库是否变动的间隔时间,毫秒单位-->
              <sqlCacheDependency enabled="true" pollTime="10000">
                  <databases>
                      <add name="数据库名" connectionStringName="Webconfig的连接字符串key" pollTime="10000"/>
                  </databases>
              </sqlCacheDependency>
          </caching>

    编码实现

    缓存操作类:

            /// <summary>
            /// 获取所有相关配置并对应添加CacheDependency对象
            /// </summary>
            /// <param name="configKey">指定需要使用Cache的数据库表名的Webconfig's key</param>
            /// <returns></returns>
            public static AggregateCacheDependency GetDepandency(string configKey)
            {
                AggregateCacheDependency dependency = new AggregateCacheDependency();
                string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
                string tableConfig = ConfigurationManager.AppSettings[configKey];
                string[] tables = tableConfig.Split(',');
                foreach (string tableName in tables)
                    dependency.Add(new SqlCacheDependency(dbName, tableName));
                return dependency;
            }

    缓存业务类:

        /// <summary>
        /// 友情链接SqlCacheDependency
        /// </summary>
        public class LinksProxy
        {
            /// <summary>
            /// 设置缓存持续时间
            /// </summary>
            private static readonly int CacheTimeout = int.Parse(ConfigurationManager.AppSettings["LinksCacheDuration"]);
            /// <summary>
            /// 是否开启缓存
            /// </summary>
            private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);

            /// <summary>
            /// 获取全部友情链接
            /// </summary>
            public static IList<LinksInfo> GetLinks()
            {
                //如果不开启缓存则直接调用DAL方法执行常规操作
                if (!enableCaching)
                    return LinksDAL.SelectLinks();
                else //开启缓存
                {
                    //设置缓存key,这个最好根据查询条件来设置,这样可以缓存同一条件的数据
                    string key = "Links_by_search_all";
                    //读取缓存中的数据
                    IList<LinksInfo> data = (IList<LinksInfo>)HttpRuntime.Cache[key];
                    if (data == null)//如果缓存没有读到数据
                    {
                        //访问DAL从数据库读取数据并加入缓存,最后返回
                        data = LinksDAL.SelectLinks();
                        AggregateCacheDependency acd = TableCacheDependency.GetDepandency("LinksTableDependency");
                        HttpRuntime.Cache.Add(key, data, acd,DateTime.Now.AddMinutes(CacheTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
                    }
                    return data;
                }
            }


    }

     


  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/tangself/p/2160453.html
Copyright © 2011-2022 走看看