Asp.net数据库缓存依赖

Asp.net数据库缓存依赖

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

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

  实现步骤:

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

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

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

<?xml version="1.0"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
    <system.web>

        <caching>
            <sqlCacheDependency enabled="true" pollTime="6000">
                <databases>
                    <add name="codematic" connectionStringName="strcodematic" />
                </databases>
            </sqlCacheDependency>
        </caching>
    </system.web>
    <connectionStrings>
        <add  name="strcodematic" connectionString="server=.;database=XLinShaWyDBase;uid=sa;pwd=123"/>
    </connectionStrings>
</configuration>

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

  注意:在<databases>节的<add name="codematic" connectionStringName="strcodematic"/>中的name属性值必须和第三步的Page_Load代码中System.Web.Caching.SqlCacheDependency("codematic","dbo.Contact"); 中的第一个参数(数据库名称)相一致。
  第二步:执行下述命令,为 数据库启用缓存依赖。

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

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

  如:(C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319)

  aspnet_regsql -C "data source=.;initial catalog=XLinShaWyDBase;user id=sa;password=123" -ed -et -t "dbo.Contact"

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

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

生产成功后,在对应的数据库,会多一个表dbo.AspNet_SqlCacheTablesForChangeNotification

select * from dbo.AspNet_SqlCacheTablesForChangeNotification

 注意:

  要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。

  有两种方法配置SQLServer:

  一使用aspnet_regsql命令行工具,

  二使用SqlCacheDependencyAdmin类。

  例如:

  aspnet_regsql -S "server"-E -d "database"–ed  或者

  aspnet_regsql -S "server"-E -d "database"-et -t "table"
  如果是Sql验证的话要把-E换成,-U (用户名),-P (密码)

  以下是该工具的命令参数说明:

  -? 显示该工具的帮助功能;

  -S 后接的参数为数据库服务器的名称或者IP地址;

  -U 后接的参数为数据库的登陆用户名;

  -P 后接的参数为数据库的登陆密码;

  -E 使用当前登录用户的 Windows 集成认证进行身份验证。

  -d 后接参数为对哪一个数据库采用SqlCacheDependency功能;

  -C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U和-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。

  -t 后接参数为对哪一个表采用SqlCacheDependency功能;

  -ed 允许对数据库使用SqlCacheDependency功能;

  -dd 禁止对数据库采用SqlCacheDependency功能;

  -et 允许对数据表采用SqlCacheDependency功能;

  -dt 禁止对数据表采用SqlCacheDependency功能;

  -lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;

public partial class Default4 : System.Web.UI.Page
{
    /// <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", "dbo.Contact");
                SetCache(CacheKey, objModel, dep);//写入缓存
            }
        }
        GridView1.DataSource = (DataSet)objModel;
        GridView1.DataBind();
    }
    private DataSet GetData()
    {
        string conString = "data source=.;initial catalog=XLinShaWyDBase;user id=sa;password=123"; string strSQL = "SELECT * FROM dbo.Contact";
        SqlConnection myConnection = new SqlConnection(conString);
        DataSet ds = new DataSet(); myConnection.Open();
        SqlDataAdapter adapter = new SqlDataAdapter(strSQL, myConnection); adapter.Fill(ds, "dbo.Contact");
        myConnection.Close();
        return ds;
    }

}

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

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

  public SqlCacheDependency(string databaseEntryName,string tableName)

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

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

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

时间: 2024-08-04 09:14:19

Asp.net数据库缓存依赖的相关文章

开启SQLSERVER数据库缓存依赖优化网站性能

很多时候,我们服务器的性能瓶颈会是在查询数据库的时候,所以对数据库的缓存非常重要,那么有没有一种方法,可以实现SQL SERVER数据库的缓存,当数据表没有更新时,就从缓存中读取,当有更新的时候,才从数据表中读取呢,答案是肯定的,这样的话我们对一些常用的基础数据表就可以缓存起来,比如做新闻系统的新闻类别等,每次就不需要从数据库中读取了,加快网站的访问速度. 那么如何开启SQLSERVER数据库缓存依赖,方法如下: 第一步:修改Web.Config的<system.web>节的配置,代码如下,让

.NET 数据库缓存依赖策略实现

处理大型门户网站 一般都需要 使用缓存技术这个web加速器在 PHP 和 java 一般 使用的是 基于squid 来做. 当然在 windows .NET 平台也是可以的 squid有 windows版本.这个以后再去研究,现在 就介绍一下 .NET 自带的 缓存策略.Microsoft的petshop就用到了它; 一.基于数据库触发(设置缓存依赖策略,当数据库中数据发生变化时,触发缓存失效;但微软提供的解决方案目前仅支持SQL Server,如果是ORACLE需要自己实现触发接口). 二.基

使用 SQL 缓存依赖项,数据库缓存依赖 (附实例)

使用 SQL 缓存依赖项 最简单的缓存策略就是使缓存数据在一个指定的时间周期后过期.但是这个简单的方法意味着缓存数据没有保持与底层数据源的联系,从而导致过期数据长时保存或当前数据很快过期.更好的方法是使用 SqlCacheDependency 类,这样数据一直被缓存,直到其底层数据在 SQL 数据库中被修改.本篇教程将讲解怎样使用这个类. Part 1 简介 使用 ObjectDataSource 缓存数据 和在架构中缓存数据 教程中探讨的缓存技术使用基于时间的有效期 , 在指定的周期过后从缓存

Asp.net文件缓存依赖

Asp.net文件缓存依赖 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Default4 : System.Web.UI.Page { /// <summary> /// 获取当前应用程序指定CacheKey的Cache对

Yii2.0数据库缓存依赖发布的使用理解

对于产品中经常需要生成一些缓存类的东西,比如系统基础配置,商品分类等,每次修改调整后都要手动进行缓存发布,是不是非常麻烦!这时候Yii2.0的缓存依赖发布就起到至关重要的作用了!现将主要的使用流程介绍如下: 1.在需要缓存依赖发布的数据表新增一个update_time字段,每次添加.修改记录后都会相应改变update_time的值: 2.保证需要缓存依赖发布的数据表每次保存(包括更新操作)都能更新update_time的值: // 所有表model继承的基础BaseModel.php /** *

c# 数据库缓存依赖

1.为缓存依赖项启动通知数据库 在vs开发人员命令提示中运行(切换到aspnet_regsql.exe所在目录,示例目录:C:\Windows\Microsoft.NET\Framework64\v4.0.30319):    aspnet_regsql -S .  -U sa -P pwd -ed -d xxx  -et -t xxx; 缓存依赖禁用: aspnet_regsql -S . \ds -E -dd -d XXX -S服务器名称 -E集成身份验证 -U 账号 -P 密码  -ed为

System.Web.Caching.Cache类 Asp.Net缓存 各种缓存依赖

Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用于缓存的字节数. Item 获取或设置指定键处的缓存项. 二.方法 方法

缓存依赖(文件、数据库)

前言 缓存的基本用法介绍:我推荐看下  asp.net缓存 . 本篇,我主要写下一般sql的缓存依赖,还有使用Mvc过滤器的数据库缓存依赖. 什么是缓存依赖 1.缓存:是把你要访问的资源,放在内存中,占用一定的内存空间,从而是用户读取内存中的数据,进而减少读取数据库,或资源文件的次数,从而对你的程序并发量,以及返回请求速率上得到提高的一种机制. 2.缓存的不及时性:由于在缓存的作用时间内,数据放在内存中,不知道数据源是否已经改变,从而是信息失去即时效应. 3.解决不及时性:为啦解决第二条的不及时

System.Web.Caching.Cache类 缓存 各种缓存依赖

System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 一.属性 属性 说明 Count 获取存储在缓存中的项数. EffectivePercentagePhysicalMemoryLimit 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比. EffectivePrivateBytesLimit 获取可用