数据库缓存依赖——S qlCacgeDependency

    xiaoxiao2025-05-31  31

      更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能。但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据就是老的数据,从而导致数据的不一致。那有没有办法做到,数据如果不变化,用户就一直从缓存中取数据,一旦数据变化,系统能自动更新缓存中的数据,从而让用户得到更好的用户体验。 

      答案是肯定的!.NET已经为我们提供了这样一种非常好的解决方法:SqlCacheDependency数据库缓存依赖。 

      实现步骤: 

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

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

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

    <strong><span style="font-size:18px;"><?xml version="1.0"?> <configuration> <appSettings/> <connectionStrings> <add name="strcodematic" connectionString="data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <caching> <sqlCacheDependency enabled="true" pollTime="6000"> <databases> <add name="codematic" connectionStringName="strcodematic" /> </databases> </sqlCacheDependency> </caching> <compilation debug="true"> </compilation> <authentication mode="Windows"/> </system.web> </configuration></span></strong>        这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字,这个名字将在第3步中用到。

    SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。

       注意:在<databases>节的<add name="codematic" connectionStringName="strcodematic"/>中的name属性值必须和第三步的Page_Load代码中System.Web.Caching.SqlCacheDependency("codematic","P_Product"); 中的第一个参数(数据库名称)相一致。

    第二步:

    1.开启数据库监听服务

    ALTER DATABASE TestDB SET ENABLE_BROKER;

    2.检查数据库是否启用监听服务

    SELECT is_broker_enabled FROM sys.databases WHERE name = 'TestDB'

    (1为已启用,0为未启用)

    第三步:在代码中使用缓存,并为其设置SqlCacheDependency依赖: 

    <strong><span style="font-size:18px;">/// <summary> /// 获取当前应用程序指定CacheKey的Cache对象值 /// </summary> /// <param name="CacheKey">索引键值</param> /// <returns>返回缓存对象</returns> public static object GetCache(string CacheKey) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; return objCache[CacheKey]; } /// <summary> /// 设置以缓存依赖的方式缓存数据 /// </summary> /// <param name="CacheKey">索引键值</param> /// <param name="objObject">缓存对象</param> /// <param name="cacheDepen">依赖对象</param> public static void SetCache(string CacheKey, object objObject, System.Web.Caching.CacheDependency dep) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; objCache.Insert( CacheKey, objObject, dep, System.Web.Caching.Cache.NoAbsoluteExpiration,//从不过期 System.Web.Caching.Cache.NoSlidingExpiration,//禁用可调过期 System.Web.Caching.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) { //依赖数据库codematic中的P_Product表变化 来更新缓存 System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("codematic", "P_Product"); SetCache(CacheKey, objModel, dep);//写入缓存 } } GridView1.DataSource = (DataSet)objModel; GridView1.DataBind(); } //查询数据 private DataSet GetData() { string conString = "data source=127.0.0.1;initial catalog=codematic;user id=sa;password="; string strSQL = "SELECT * FROM P_Product"; SqlConnection myConnection = new SqlConnection(conString); DataSet ds = new DataSet(); myConnection.Open(); SqlDataAdapter adapter = new SqlDataAdapter(strSQL, myConnection); adapter.Fill(ds, "Product"); myConnection.Close(); return ds; }</span></strong>

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

      其中,创建SqlCacheDependency的构造方法:

      public SqlCacheDependency(string databaseEntryName,string tableName)

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

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

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

    转载请注明原文地址: https://ju.6miu.com/read-1299454.html
    最新回复(0)