关于数据库缓存技术 企业的一整套ERP已经开发完成,但是没有一套好一点的缓存解决方案,比如科目,我的页面如何监视数据库的变化来良好的进行实施信息的捕获呢,还请各位大大帮忙,比如表没有更新,那么我的页面数据就使用缓存,更新后立即更新为新的信息,保持信息的实时性和高效性。谢谢各位大大了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用web服务来监视数据库服务?这种思路不太对呀。在未查询数据库前是不知道表有没有更新的,而每一次查询也只能知道当前的表数据。而页面缓存只能提前指定页面缓存的过期时间,你根本不知道下一次更新在什么时候,怎么设定过期时间呢? 那你是想用页面缓存还是表缓存呢?页面缓存可能得要有支持页面缓存调度API的专用服务器才行,这一块我不太懂,用表缓存的话,在web服务器上搞个全局内存表,搞个全局变量i,开个定时器,数据库端搞个触发器,当表1执行编辑后,更新一个单行表2中的字段值+1。在web上的定时器中取表2的值,当与全局变量i不一样时,取数据库中的数据更新全局内存表。平时大家都取全局内存表就行了。 要是你打算用Squid作缓存服务的话,推荐你看一下这篇文章。用来清理页面缓存。不过我自己没有试过,我只见别人用这个做过纯html的缓存。http://blog.csdn.net/jiedushi/archive/2009/08/04/4408105.aspx asp.net 中的 数据库缓存依赖 数据库缓存依赖..参考http://www.cnblogs.com/xiaogangqq123/default.html?page=2 http://www.cnblogs.com/xiaogangqq123/archive/2010/04/29/1723551.html这个... 第三方分布式缓存解决方案 Memcached和Cacheman 缓存全解析 缓存控制是相当简单的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或者数据缓存自动释放掉。 由SQL数据库主动发出已更新的信号. 对于数据缓存的测试就更加是小儿科。你可以找一个你的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还是数据缓存都)即时释放掉。缓存很容易,但是为什么很少有人提及?眼高手低吧! 另外也可以参考古老的asp.net2.0教程:http://www.wewill.cn/n313c13.aspxhttp://www.wewill.cn/n317c13.aspx但是正如我在demo中所举的,如果你的修改动作都是在网站上执行的,其实用不着SqlDependency那种东西,使用一个cache单元(仅仅需要我在button的事件中执行的那样一条轻松的指令)做标记来触发所有依赖与它的缓存释放掉,而不需要在SQL Server这一棵树上“吊着”(我建议做一般的网站不要考虑使用SQL Server作为数据库,使用轻量级的嵌入式数据库才是首选——当然不是access那么过时的东西)。 页面输出的时间其实是输出字符串流,你可以将字符串缓存起来(设置一个标志位,标志数据库是否更新),访问页面的时间,如果标志位为true,则重新查询数据库,false则直接输出字符串. 学习asp.net之路 高分探讨自动发送邮件 求有例题,项目的.NET学习网站,适合新手! 请教一个问题,急. 读取数据库年月日! 存储过程我可以写在CS文件里吗? 下载后自动关闭窗口 这是不是.net平台的bug哦……真是郁闷啊 关于HtmlSelect的小问题 再次提问,迫切需要得到解决的问题!!请各路兄弟帮忙了 asp.net程序提示出错,大家帮忙看看 高分求段代码越详细越好
页面缓存可能得要有支持页面缓存调度API的专用服务器才行,这一块我不太懂,用表缓存的话,在web服务器上搞个全局内存表,搞个全局变量i,开个定时器,数据库端搞个触发器,当表1执行编辑后,更新一个单行表2中的字段值+1。在web上的定时器中取表2的值,当与全局变量i不一样时,取数据库中的数据更新全局内存表。平时大家都取全局内存表就行了。
http://blog.csdn.net/jiedushi/archive/2009/08/04/4408105.aspx
http://www.cnblogs.com/xiaogangqq123/default.html?page=2
缓存全解析
{
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或者数据缓存自动释放掉。
{
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还是数据缓存都)即时释放掉。
缓存很容易,但是为什么很少有人提及?眼高手低吧!
http://www.wewill.cn/n317c13.aspx但是正如我在demo中所举的,如果你的修改动作都是在网站上执行的,其实用不着SqlDependency那种东西,使用一个cache单元(仅仅需要我在button的事件中执行的那样一条轻松的指令)做标记来触发所有依赖与它的缓存释放掉,而不需要在SQL Server这一棵树上“吊着”(我建议做一般的网站不要考虑使用SQL Server作为数据库,使用轻量级的嵌入式数据库才是首选——当然不是access那么过时的东西)。