cuike519的blog

工作、学习、娱乐

用户操作
[即时聊天] [发私信] [加为好友]
wujianID:cuike519
86770次访问,排名1171(1),好友2人,关注者13人。
cuike519的文章
原创 44 篇
翻译 0 篇
转载 0 篇
评论 133 篇
cuike519的公告
很久没有写blog了,总觉得生活少点什么。我的新邮件Mathew.mike@hotmail.com My MSNspase is http://gunsbypower.spaces.msn.com/
最近评论
nychanglingfeng:真是挺牛的
nychanglingfeng:真是挺牛的
fmmmeck:今天我也遇到这个问题了,多亏了这篇文章和 lf_shao 的修正 !
fmmmeck:今天我也遇到这个问题了,多亏了这篇文章和 lf_shao 的修正 !
fmmmeck:今天我也遇到这个问题了,多亏了这篇文章和 lf_shao 的修正 !
文章分类
收藏
    相册
    程序代码
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 如何在ASP.NET2.0下面使用基于数据库(SqlServer2000)的Cache收藏

    新一篇: VS2005为什么会有两个AssemblyInfo | 旧一篇: VS2005为什么会有两个AssemblyInfo

    在.NET1.1下面Cache只能基于文件系统、对象等做Cache的依赖项,但是在.NET 2.0提供了一个新的依赖项SqlCacheDependency,这个项使我们Cache依赖数据库的变化来改变。虽然这做法看起来和1.1里面的变通做法相似,但是它们之间还是有本质的区别(SqlCacheDependency对象的提供)。(1.1的变通做法是为数据表创建触发器,然后该触发器在触发的时候会修改一个本地文件,系统中的某一个Cache的依赖项就是这个本地的文件,这样来通知Cache所缓存的数据变化了)

         .NET 2.0的SqlCacheDependency可以在SqlServer2000以后的版本使用,本文介绍在Sql Server 2000下的使用方法,Sql Server 2005的稍有不同。

           首先需要安装.NET 2.0的框架,当然Sql Server 2000一定要有了。在.NET 2.0里微软提供了一个实用工具:aspnet_regsql(和aspnet_regiis在同一个目录下面),这是一个命令行工具,该命令行参数可以通过aspnet_regsql -?获得。这里我们关心下面几个参数:-ed为SQL缓存依赖项启动数据库,-E使用当前的windows凭据进行身份验证,-d用于应用服务器的数据库名称,如果未指定任何数据库名称,则使用默认数据库“aspnetdb”。本文中将使用微软的示例数据库pubs。那么我们就要使用下面的命令行来创建缓存依赖数据库:

    aspnet_regsql -ed -E -d pubs
    (注意:这里的命令行参数是去分大小写的)

         当执行完这个命令后,我们可以打开pubs数据库看看发生了什么变化,首先多了一个表:AspNet_SqlCacheTablesForChangeNotification,这个表里面有3个字段,tableName:监视的表名称,notificationCreated:创建时间。changeId:变化编号(累加字段)。还可以看到该数据库多了几个存储过程,他们分别是:

    AspNet_SqlCacheRegisterTableStoredProcedure,

    AspNet_SqlCacheUnRegisterTableStoredProcedure,
    AspNet_SqlCacheUpdateChangeIdStoredProcedure,
    AspNet_SqlCacheQueryRegisteredTablesStoredProcedure,
    AspNet_SqlCachePollingStoredProcedure
     
         从字面上这几个存储过程都很好理解,该存储过程的详细内容可以在查询分析器里面打开后查看。为了可以监视一个表的变化,我们需要通过执行AspNet_SqlCacheRegisterTableStoredProcedure存储过程来指定一个需要监视的表,当然也可以通过实用工具aspnet_regsql来指定,命令行如下:
    aspnet_regsql -et -E -d pubs -t authors
     
         通过执行上面的命令以后,aspnet_regsql会为authors创建一个触发器,下面是我执行该命令后创建的触发器:
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO
    ALTER  TRIGGER dbo.[authors_AspNet_SqlCacheNotification_Trigger] ON [authors]
                           FOR INSERT, UPDATE, DELETE AS BEGIN
                           SET NOCOUNT ON
                           EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'authors'
                           END
                          
    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO
         从触发器可以看出,当对authors表插入,删除以及更新的时候都会执行存储过程AspNet_SqlCacheUpdateChangeIdStoredProcedure,该存储过程会向AspNet_SqlCacheTablesForChangeNotification表里面添加一条记录。记录如下:
    tableName    notificationCreated      changeId   
    authors      2006-06-20 09:38:26.267  1
         当你对authors里面的数据做任何修改changeId都会累加,其他字段不变化。
     
         接着要在web.config里面添加一些内容就可以使用了。
    首先添加数据库连接串:
    <connectionStrings>
        <add name ="pubsConString" connectionString="server=localhost;database=pubs;uid=sa;pwd=mypassword;"/>
      </connectionStrings>

    其次添加caching节:
    <system.web>
        <caching>
          <sqlCacheDependency enabled="true">
            <databases>
              <add name="pubs" connectionStringName="pubsConString" pollTime="900"/>
            </databases>
          </sqlCacheDependency>
        </caching>
    </system.web>
     
    下面是测试代码,当页面加载的时候执行如下代码:

    protected void Page_Load(object sender, EventArgs e) {
            if (HttpContext.Current.Cache["xxx"] == null) {
                SqlCacheDependency d = new SqlCacheDependency("pubs","authors");//pubs就是databases节指定的pubs,后面是表名
                HttpContext.Current.Cache.Insert("xxx", "xxx", d);
                Response.Write("Create new cache value is xxx.");
            }
            else{
                Response.Write("Load data from cache,value is "+HttpContext.Current.Cache["xxx"].ToString());
            }
        }
     
    当首次打开该页面将显示:
    Create new cache value is xxx.

    刷新页面后显示:
    Load data from cache,value is xxx

    当使用查询分析器修改authors里面的数据再次刷新页面将显示:
    Create new cache value is xxx.

    这说明Cache正常工作了,当表authors变化Cache里面的内容会自动失效,我的应用程序也会重新创建一个Cache对象。
     
    注意:SqlCacheDependency由两个构造函数,SqlServer2000只支持两个参数的,一个参数的支持SqlServer2005。
     
     
    有不正确的地方请指正,谢谢。

    发表于 @ 2006年06月20日 13:00:00|评论(loading...)|编辑

    新一篇: VS2005为什么会有两个AssemblyInfo | 旧一篇: VS2005为什么会有两个AssemblyInfo

    评论

    #dsj1234 发表于2007-01-12 15:07:03  IP: 219.130.85.*
    好贴。
    #dsj1234 发表于2007-01-12 15:08:33  IP: 219.130.85.*
    好贴。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © cuike519