企业的一整套ERP已经开发完成,但是没有一套好一点的缓存解决方案,比如科目,我的页面如何监视数据库的变化来良好的进行实施信息的捕获呢,还请各位大大帮忙,比如表没有更新,那么我的页面数据就使用缓存,更新后立即更新为新的信息,保持信息的实时性和高效性。谢谢各位大大了。

解决方案 »

  1.   

    用web服务来监视数据库服务?这种思路不太对呀。在未查询数据库前是不知道表有没有更新的,而每一次查询也只能知道当前的表数据。而页面缓存只能提前指定页面缓存的过期时间,你根本不知道下一次更新在什么时候,怎么设定过期时间呢?
      

  2.   

    那你是想用页面缓存还是表缓存呢?
    页面缓存可能得要有支持页面缓存调度API的专用服务器才行,这一块我不太懂,用表缓存的话,在web服务器上搞个全局内存表,搞个全局变量i,开个定时器,数据库端搞个触发器,当表1执行编辑后,更新一个单行表2中的字段值+1。在web上的定时器中取表2的值,当与全局变量i不一样时,取数据库中的数据更新全局内存表。平时大家都取全局内存表就行了。
      

  3.   

    要是你打算用Squid作缓存服务的话,推荐你看一下这篇文章。用来清理页面缓存。不过我自己没有试过,我只见别人用这个做过纯html的缓存。
    http://blog.csdn.net/jiedushi/archive/2009/08/04/4408105.aspx
      

  4.   

    asp.net 中的 数据库缓存依赖
      

  5.   

    数据库缓存依赖..参考
    http://www.cnblogs.com/xiaogangqq123/default.html?page=2
      

  6.   

    http://www.cnblogs.com/xiaogangqq123/archive/2010/04/29/1723551.html这个...
      

  7.   

    第三方分布式缓存解决方案 Memcached和Cacheman 
    缓存全解析
      

  8.   

    缓存控制是相当简单的asp.net技术,可惜很多人都花精力去玩技术去了,对于缓存不太懂。给你随便写个demo测试,体会一下:首先,创建一个aspx,在上面拖入一个button控件,然后写一个事件处理方法:protected void Button1_Click(object sender, EventArgs e)
    {
        Cache["xyz"] = DateTime.Now.Ticks;
    }
    这就是我们用来模拟“某事发生”做个标志(记录了最后更改时间)。例如你可以把xyz替换为“管理部门人事信息最后变动时间”。然后,找一个aspx或者ascx,在其第二行加入如下的描述:<%@ OutputCache Duration="600" VaryByParam="*" VaryByCustom="byCache:xyz" %>
    实际上你需要首先学会VaryByCustom和VaryByControl。我这里仅仅演示VaryByCustom。这里最后一个参数就是声明我们需要让这个aspx或者ascx自动缓存,直到xyz改变。byCache是我自己的写的一个前缀,以便在global.asax中知道用哪种方式处理。例如global.ascx中写:<%@ Application Language="C#" %>
    <script RunAt="server">
        
        public override string GetVaryByCustomString(HttpContext context, string custom)
        {
            if (custom.StartsWith("byCache:"))
            {
                var value = context.Cache[custom.Substring(8)];
                return value == null ? string.Empty : value.ToString();
            }        return base.GetVaryByCustomString(context, custom);
        }
    </script>
    这里,如果传入的cutom字符串是以byCache为前缀的,我们就知道界面维护人员希望此页面以冒号后边的内容为控制key。好了,现在可以测试了。首先你打开第一个有着一个button的aspx,然后再打开你的那个标记着OutputCache的aspx或者有它ascx的aspx,试着刷新后者,你会看到内容从来不刷新,也从来不读取数据库或者在后台计算之类的,因为它是直接拿出html输出到客户端的。然后你转到第一个aspx上面点击一下button,再看第二个aspx刷新,你会发现此时读取数据库了,进行后台的复杂计算了,内容改变了。再次刷新第二个aspx,又是直接拿出缓存的html输出到浏览器,直到你再一次点击button来修改控制参数。你可以用一个参数来控制网站中成百上千的页面或者ascx局部片段。例如在写某些信息的时候,记住像这个button一样写一条语句记录数据修改了(我的demo中是用DateTime.Now.Ticks的值来标记),这就触发了网站中所有依赖于它的OutputCache或者数据缓存自动释放掉。
      

  9.   

    由SQL数据库主动发出已更新的信号.
      

  10.   

    对于数据缓存的测试就更加是小儿科。你可以找一个你的DataSource控件进行select操作使用的BLL方法,例如这个public static 用户登录状况报告Item[] GetPassportStatusReport(在线状态 status, string userGroup)
    {
        return 查询数据库返回用户登录状况报告(status, userGroup);
    }
    可以改为使用数据缓存:public static 用户登录状况报告Item[] GetPassportStatusReport(在线状态 status, string userGroup)
    {
        var key="用户登录状况报告_"+status.ToString+"_"+userGroup;
        var cache = HttpRuntime.Cache;
        var ret=(用户登录状况报告Item[])cache[key];
        if(ret==null)
        {
            ret=查询数据库返回用户登录状况报告(status, userGroup);
            if(cache["xyz"]==null)
               cache["xyz"]=0;   //你也可以将这种初始化语句写在global.asax中。
            cache.Insert(key,ret,new CacheDependency(null,new string[]{"xyz"}));//第二个参数可以有多个
        }
        return ret;
    }
    然后这就可以测试凡是调用这个BLL方法的页面,你会看到除了第一次查询报表以外,只有点击第一个aspx上的button来刷新xyz缓存单元的值时,才会调用数据库去查询报表。而当你修改数据时,所要做的也就是像button那样写一行语句,来触发网站上成百上千个缓存(不论是OutputCache还是数据缓存都)即时释放掉。
    缓存很容易,但是为什么很少有人提及?眼高手低吧!
      

  11.   

    另外也可以参考古老的asp.net2.0教程:http://www.wewill.cn/n313c13.aspx
    http://www.wewill.cn/n317c13.aspx但是正如我在demo中所举的,如果你的修改动作都是在网站上执行的,其实用不着SqlDependency那种东西,使用一个cache单元(仅仅需要我在button的事件中执行的那样一条轻松的指令)做标记来触发所有依赖与它的缓存释放掉,而不需要在SQL Server这一棵树上“吊着”(我建议做一般的网站不要考虑使用SQL Server作为数据库,使用轻量级的嵌入式数据库才是首选——当然不是access那么过时的东西)。
      

  12.   

    页面输出的时间其实是输出字符串流,你可以将字符串缓存起来(设置一个标志位,标志数据库是否更新),访问页面的时间,如果标志位为true,则重新查询数据库,false则直接输出字符串.