string s=(string)Cache["aa"];
        if (s==null)
        {
            s = "1";
            string constr = "server=.;database=Test;user id=**;password=**";
            System.Data.SqlClient.SqlDependency.Start(constr);
            SqlConnection con = new SqlConnection(constr);
            SqlCommand com = new SqlCommand("Select CategoryId,Name,Descn from dbo.Category", con);
            SqlCacheDependency scd = new SqlCacheDependency(com);
            this.Cache.Insert("aa", s, scd);
        }为什么表中的数据更改了Cache["aa"]中的数据没有别清空呢?而我用轮询的方式却没有问题:        string s=(string)Cache["aa"];
        if (s==null)
        {
            s = "1";
            SqlCacheDependency scd = new SqlCacheDependency("Test","Category");
            this.Cache.Insert("aa", s, scd);
        }这样做(当然Web.config中有相应的配置),当表的数据改变时Cache["aa"]就可以清空。为什么第一种非轮询的方式不行呢?在百度搜索了两天了,还没有解决

解决方案 »

  1.   

    问题我自己解决了,希望sp1234过来我把分给他,喜欢sp1234
      

  2.   

    解决了,恭喜。我现在不使用SQL Server所以这个问题我也不知道做法。我给你另外一个实现方式的素材,跟任何数据库都没有关系的:
    假设我们在一个地方修改了数据库,比如影响了两个表ta、Category中的数据,我们可以写这样两句        Cache.Insert("表ta最后变动时间", DateTime.Now.Ticks);
            Cache.Insert("表Category最后变动时间", DateTime.Now.Ticks);
    然后在读取与数据库表相关数据时就可以写:string s=(string)Cache["aa"];
    if (s==null)
    {
        s = 从数据库中查询数据();
        Cache.Insert("aa", s, new CacheDependency (new string[]{},new string[]{"表Category最后变动时间"});
    }
    约定全局的cache单元作为依赖项,也是可以的。当然这样做,如果别的应用程序不经过我们的应用程序直接修改数据库,我们的程序就得不到通知。但是这样做的好处也很明显,跟任何数据库都没有关系,我们的程序自己从业务逻辑层面控制了缓存。
      

  3.   

    解释一下上面,CacheDependency 类已经可以监视磁盘文件、时钟、Cache单元,上面就是用了第三点,当Cache["表Category最后变动时间"]中的值改变时,所有依赖于它的缓存数据就自动都清除了。
      

  4.   

    cache更新。
    没搞过,不过p哥的方法很不错。
    按照时间来判断。
      

  5.   

    呵呵,另外我可以进一步建议一下,我们可以简化一些说法来直截了当地说,你的例子中缓存结果s所使用的缓存key——aa,当使用关系数据库时,其实我们可以规定为使用sql语句作为key。即使在分页查询时sql中也包含分页信息。这样,当整个网站上有相同的sql查询时,都可以先看看有没有查询结果已经缓存了,而用不着去费心思考虑如何传递aa这个名字的问题。