系统缓存学习(六)数据库缓存依赖

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

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

实现步骤:

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

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

将下列代码加入web.config的节:

<?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>

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

image

第二步:执行下述命令,为 数据库启用缓存依赖。

如果要配置SqlCacheDependency,则需要以命令行的方式执行。

aspnet_regsql.exe工具位于Windows//Microsoft.NET//Framework//[版本]文件夹中。

aspnet_regsql -C "data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" -ed -et -t "P_Product"

参数-C后面的字符串是连接字符串(请替换成自己所需要的值),

参数-t后面的字符串是数据表的名字。

运行结果如图15-3所示:

image

命令执行后,在指定的数据库中会多出一个AspNet_SqlCacheTablesForChangeNotification表。

image

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

///
/// 获取当前应用程序指定CacheKey的Cache对象值
///
///

 

 

 

索引键值
/// 返回缓存对象
public static object GetCache(string CacheKey)
{
    System.Web.Caching.Cache objCache = HttpRuntime.Cache;
    return objCache[CacheKey];
}

 

 

 

 

///
/// 设置以缓存依赖的方式缓存数据
///
///

 

 

 

索引键值
///缓存对象
///依赖对象
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;
}

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

databaseEntryName :是在Web.config 文件的 caching 节的 sqlCacheDependency 的 databases 元素中定义的数据库的名称。
tableName :与 SqlCacheDependency 关联的数据库表的名称。
这样,只有当P_Product表的内容发生变化时,查询操作才会重新查询数据更新缓存的内容,可以大大减少数据库的重复查询和提高系统的性能和运行效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值