asp.net 缓存分页(顶者有分) 网站流量越来越大了,原有的技术已经不能满足现在的需求,参考了一些技术后决定使用 数据缓存依赖技术,数据库服务器使用Sql Server2005,现在郁闷的事情就是这个缓存的分页问题了。难道真的鱼和熊掌不可兼得????有大牛帮忙下吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看下这个资料http://download.csdn.net/source/248724 通过静态页或过程http://blog.csdn.net/Ghosthuo/archive/2008/07/30/2735398.aspx http://download.csdn.net/down/248724/wxs1984http://www.nx.cn/bbs/thread-510-1-1.htmlhttp://www.operamasks.org/bbs/viewthread.php?tid=2981 回 5楼的是JAVA的小弟JAVA很菜!汗。。6楼的http://download.csdn.net/down/248724/wxs1984 http://www.nx.cn/bbs/thread-510-1-1.html 第一个只有大体的思路。第二个不现实偶数据量100万以上,内存估计得20G吧第三个分页控件没有这个功能! SQL SERVER 2005 参见ROWNUMBER存储过程分页就OK了 这要看你使用什么样的数据源技术。不论是ObjectDataSource还是SqlDataSource组件,都有CacheDuration、CacheKeyDependency、CacheExpirationPolicy、SqlCacheDependency之类的现成的技术。“参考了一些技术后决定”,真不知道你们参考了什么东西。如果你要自己编写代码对数据进行缓存,那么你缓存的应该仅仅是一页数据,而不是整个数据表,这个要明确。 所谓的数据缓存,例如你可以写:public static BLL{ public static DataTable GetAbcTable(string sql,int pageIndex) { string key="sql="+sql+";;page="+pageIndex.ToString(); DataTable ret=(DataTable)HttpContext.Current.Cache[key]; if(ret==null) { ret=查询数据库(sql,pageIndex); HttpContext.Current.Cache.Inser(key,ret); //实际上你应该设置另外3个参数,例如设置SqlDependency来使得ret依赖数据库变动而自动刷新 } return ret; }....}其实我从来不使用DataTable或者DataSet(我使用强业务类型的对象集合),而且我也不使用sql字符串作为查询条件(而是使用Linq的查询表达式作为查询条件),这里只是对编程初学者举例而已。 也就是说,Cache中缓存的是根据某个sql查询并且仅仅包含某个页面的数据,把整个表的数据丢到缓存中是不明智的,因为那会因为数据的一点改动而频繁丢弃缓存中的大量用不到的数据。缓存技术的关键技术就在于你要设置SqlDependency或者其它手段让缓存的数据在变成脏数据时自动刷新(脏数据从缓存中自动清除出去),而不是把数据放到内存中这么简单粗劣的设计,这个要注意。 如果你手写自己的数据缓存(而不是数据源控件已经做好的缓存控制机制),那么你也不需要在界面层编写任何数据缓存代码,界面层就好像没有任何缓存一样仍然从BLL层取得数据。你只是需要在BLL的较高层次调用缓存机制,如果缓存中没有所取得的那一页面的数据,才调用原来的没有缓存的BLL。因此,把你原来的程序改为所谓数据缓存的,应该仅仅增加十几条代码就搞定,真正好的程序员很少写代码,代码写的越多越是说明架构设计质量越差。 如sp1234所说的,用.NET自带的缓存技术就行。其次就是你不需要把所有数据全部缓存,比如说你缓存个10页数据到内存中也就差不多了,不可能全部缓存的,那要多大内存呀。比如GOOGLE,说搜索到XXXXXX多少数据,你翻翻看,能翻多少页。所以我推荐是,缓存部分数据,其余的不缓存。 VS2010经常崩溃 如何正确设置cache 返回上一页的问题 C# 中default 后面不加break会报错? 急!!!DATAGRID中有摸版列,要实现添加一行 IIS:代码不变,改NTFS后数据库拒绝访问,请问如何设定权限? Asp.net页面中是否可以弹出一个VB.net那样的对话框? 急!asp.net 用户管理 如何手动设置一个用户的登陆状态 WebSphere MQ 5.3 遇到的问题(急) asp.net中javascript中的问题 Asp.net ajax聊天室的问题。 我是个应届生,现在找不到工作。有一点技术,想结交社会人士一起创业?
http://download.csdn.net/source/248724
http://blog.csdn.net/Ghosthuo/archive/2008/07/30/2735398.aspx
http://www.nx.cn/bbs/thread-510-1-1.html
http://www.operamasks.org/bbs/viewthread.php?tid=2981
http://download.csdn.net/down/248724/wxs1984
http://www.nx.cn/bbs/thread-510-1-1.html 第一个只有大体的思路。第二个不现实偶数据量100万以上,内存估计得20G吧第三个分页控件没有这个功能!
参见ROWNUMBER存储过程分页就OK了
{
public static DataTable GetAbcTable(string sql,int pageIndex)
{
string key="sql="+sql+";;page="+pageIndex.ToString();
DataTable ret=(DataTable)HttpContext.Current.Cache[key];
if(ret==null)
{
ret=查询数据库(sql,pageIndex);
HttpContext.Current.Cache.Inser(key,ret); //实际上你应该设置另外3个参数,例如设置SqlDependency来使得ret依赖数据库变动而自动刷新
}
return ret;
}
....
}其实我从来不使用DataTable或者DataSet(我使用强业务类型的对象集合),而且我也不使用sql字符串作为查询条件(而是使用Linq的查询表达式作为查询条件),这里只是对编程初学者举例而已。
其次就是你不需要把所有数据全部缓存,比如说你缓存个10页数据到内存中也就差不多了,不可能全部缓存的,那要多大内存呀。
比如GOOGLE,说搜索到XXXXXX多少数据,你翻翻看,能翻多少页。所以我推荐是,缓存部分数据,其余的不缓存。