突然发现.没有数据库相应的权限.无法做到将缓存项依赖于数据库表.
我现在有个用户控件..用来显示 最新加入的 10 个用户的清单.我希望缓存这个用户控件.直到有新用户加入后.使该用户控件缓存失效.然后重新从数据库读取数据到该缓存中.现在数据库表依赖不能使用.
我的代码应该怎么写呢?等待回复.谢谢~

解决方案 »

  1.   

    数据库不能使用时什么意思?不能使用你能插入数据?你说没有权限?
    如果public 查询权限都没有你一开始的缓存是怎么写的?
      

  2.   

    我希望缓存这个用户控件.直到有新用户加入后.使该用户控件缓存失效.然后重新从数据库 
    -----------------------如果要做到实时的话,你就要不断的查询数据库进行对比,这么做并不合适所以有两个办法可以不是很精确的做你想做的1,cache过期
    2,定期查询
    -----------还有个比较简单的办法,对 注册按钮 进行ajax 到后台进时对cache的重新赋值当点击这个 注册按钮 不仅注册新会员,也同时重新查询库赋给cache
      

  3.   

    数据库缓存,其实它是一种从数据库角度希望“一网打尽”的做法,也就是说例如有人通过查询分析器、其它应用程序改变了数据库数据,也要能够通知Cache过期。很多时候,我们可能可以退一步,并不需要数据库相关的CacheDependency,例如我们仅需要当通过我们的应用程序自身改变数据库时才使得缓存失效,而并不需要保证数据库中数据修改就一定使得缓存失效,这时候我们可以简单地使用一个内存中的static变量或者cache单元来为修改数据做一个“戳记”就可以了。例如OutputCache声明为VaryByCustom="Cache:最后一次保存用户对象的Ticks"而在global.asax的代码中是public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        switch (custom)
        {
            case "Cache:最后一次保存用户对象的Ticks":
                object x = context.Cache["最后一次保存用户对象的Ticks"];
                if (x == null)
                    return string.Empty;
                else
                    return ((long)x).ToString();
            default:
                return base.GetVaryByCustomString(context, custom);
        }
    }然后检查你的“用户”所对应的BLL方法,如果你将保存用户的BLL方法最后都是调用同一个BLL方法就更好,要在其中插入代码HttpContext.Current.Cache["最后一次保存用户对象的Ticks"] = DateTime.Now.Ticks;通过这个简单的Cache单元这就使得自己的程序形成一个机制可以通知用户控件刷新。对于数据库的解决方案,类似地,我们可以简单地创建一个表用来记录每一个表最后一次数据被更改的一个散列的(不容易重复的)标志,然后在GetVaryByCustomString方法中去读取这个表。通过额外地多读取一次这个(数据记录通常很少的)表,可以避免创建用户控件以及执行用户控件中的程序,这个代价还是值得的。在我们不能修改数据库进程来增加一些很酷的进程间事件通知机制时,我们这样做的性能也是可以满意的。
      

  4.   

    哦,遗漏了一句关键的操作:在创建一个表用来记录每一个表最后一次数据被更改的一个散列的(不容易重复的)标志之后,我们要为“用户”这个数据库表创建一个“after insert,update,delete”触发器,使得只要有造成数据改变的SQL执行就改变这个表中的标记。
      

  5.   

    to 3楼你误会我意思了.我只是没有数据库服务器相应的权限
    去实现SqlCacheDependency
      

  6.   

    to 5楼我想你提供的两种方案..应该只能算是一种吧.Cache过期.和定时查询.应该是一样的..