日期:2014-05-17  浏览次数:20474 次

如何在应用程序结束时获取缓存数据
很简单一个统计下载次数的功能,不想频繁的操作数据库,每下载一次将次数累加到缓存,希望在applicattion重启的时候一次提交到数据库,但是我测试在 Application_End 方法里面获取不到缓存,已经被清空了。

请教各位有什么办法,或者有其他的更好的方案
------解决方案--------------------
Application_Disposed在End之前执行。
------解决方案--------------------
1、可以考虑用队列的形式处理,比如将每次更新的数据先加入到队列当中,当超过20个的时候在更新到数据库中
2、也可以考虑使用Cache做数据存储,设置缓存时间,当缓存到期之前将数据更新到数据库中
------解决方案--------------------
你用的什么类做的数据缓存,是System.Web.Caching.Cache吗?Application_End 在应用程序池回收的时候才会执行,而应用程序池默认自动回收时间1740分钟,如果是用的System.Web.Caching.Cache的话,利用Cache的Insert方法中参数的CacheItemRemovedCallback是可以解决你的问题的,具体的用法百度一下吧
------解决方案--------------------


这需求太简单了,楼主。

我只说一下思路:

你自己定义一个静态类,然后在该类的静态构造函数里面,初始化你的那些个缓存类实体

然后,你在该静态类的释构函数里,把缓存实体里的数据丢进数据库就可以了。

//  这个思路其实很简单,就是看准了C#里的静态类,生命周期与应用程序一样长,而且,静态构造函数只在该类第一次new实体或它的静态成员第一次被调用时,会自动执行静态构造函数,而且只会执行一次哦,因为后面无论多少次调用该类成员,都是直接指向已存在的内存地址(分配在托管垃圾堆里)。

// 那么,你可以想象,C#世界里没有什么全局变量的说法,但静态类可以用来当全局变量使用。这样,你也可以清楚的明白,静态构造函数只能被调用一次,那么它的释构函数也只能调用一次,所以在释构函数里取出缓存的数据保存到数据表里,是可行的。

// 至于怎么使用这个全局变量,相信你应该懂了,就是在
protected void Application_Start(object sender, EventArgs e)
        {
             // 在这里,你只要调用一次定义的静态类里的某个方法就可以了,该方法什么都不用做都不是问题,我们只是为了触发静态构造函数,或者我这样说更确切,我们只是为了在托管垃圾内存堆里分配该静态类的内存地址,这样它就可以和当前应用程序的生命周期一样长了,什么时候关闭当前程序,该类也就被回收,则该类的释构函数就会被执行了
        }

// 题外话:其实我说到这里,相信楼主也大概猜得到官方的 Application 对象,和缓存类 Cache, 和静态类很像对不? 呵呵,具体我也不说了,你有空自己看书
------解决方案--------------------
引用:
你用的什么类做的数据缓存,是System.Web.Caching.Cache吗?Application_End 在应用程序池回收的时候才会执行,而应用程序池默认自动回收时间1740分钟,如果是用的System.Web.Caching.Cache的话,利用Cache的Insert方法中参数的CacheItemRemovedCallback是可以解决你的问题的,具体的用法百度一下吧



// 这个委托一般是该内存集合里的某一项被移除时,会被调用一次该委托
// 那么,假如,现在内存集合里有多个数据项的话,移除多次,则会调用该委托多次哦,也就是多次写入数据库

// 不过如果只缓存一项的话,用这个理论上是可以解决的
------解决方案--------------------
引用:
1、可以考虑用队列的形式处理,比如将每次更新的数据先加入到队列当中,当超过20个的时候在更新到数据库中
2、也可以考虑使用Cache做数据存储,设置缓存时间,当缓存到期之前将数据更新到数据库中

队列并发呢?2个用户同时用一个队列,判断2个用户都成立,A用户拿一个进库再删一个,B用户也一样!

------解决方案--------------------
直接在cache的销毁事件里写不就行了