none
asp.net 使用数据缓存依赖技术如何实现分页? RRS feed

  • 问题

  •   网站流量越来越大了,原有的技术已经不能满足现在的需求,参考了一些技术后决定使用 数据缓存依赖技术,数据库服务器使用Sql Server2005,现在郁闷的事情就是这个缓存的分页问题了。难道真的鱼和熊掌不可兼得????有大牛帮忙下吗?  存储在Cache里的话,还可以找到一些办法,但是这种技术从来没用过,网上遍寻数据缓存依赖技术的分页,无果. 所以来这里求助来了..麻烦各位大牛.
    2009年2月25日 6:24

答案

  • 首先,你要明白使用分页的场合,例如,如果是查询,就没有必要缓存了,因为每个查询的关键字一般是不同的,所以,这样的功能最好使用存储过程进行优化查询。而不是缓存

    其次,如果你的数据都是固定的,比如,显示新闻的列表,只有一套数据,从缓存里面取出来之后,自己分页完全是可以,如DataTable。

    缓存依赖技术其实也就是Cache,只不过更新缓存的时刻依赖于某种条件,如sql数据库里面的数据变了,或者文件内容修改了,则重新取数据再缓存起来。

    孟宪会
    2009年2月25日 6:36
    版主
  • 1,如果可能,建议生成静态页面比缓存要好。
    2,数据量很大,缓存也是很耗费资源的,可能还不如采取存储过程来分页来得好,存储过程分页网上有很多人写的不同版本,可以参考,另外sql 2005也有一个现成的函数RowNumber等实现分页。这个功能可以参考

    http://www.google.cn/search?hl=zh-CN&q=ql+server+2005+%E5%88%86%E9%A1%B5&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f&oq=

    3,Cache的代码实现:

    DataTable news;
    if(Cache["key"] == null)
    {
     //重新从数据库查询,得到DataTable等,比如是news
    Cache.Insert("key",news);//另外还有 Add方法,两者是不同的,具体可以看msdn文档
    }
    else
    {
    news = (DataTable)Cache["key"];
    }

    这时候数据已经存在了,你可以计算当前显示的页数,然后循环 news到当前页。

    这种办法我觉得不是很好。
    不如前面的方法好



    孟宪会
    2009年2月25日 9:48
    版主
  • 可以这样,将新闻的ID与更新时间单独放在一个表中,此表可以建个索引,用来提高查询效率
    然后查询的时候按时间降序排列
    假设每页的页数是P,要查第N页的数据
    那么,通过游标取得从第N*P条开始的N条数据,就是N 个ID了
    再根据这N个ID得到N条新闻
    再把这N条新闻传到客户端

    在我的博客中有个类似的分页的例子:
    http://blog.csdn.net/curllion/archive/2006/04/18/667735.aspx

    不知我的建议合不合理,还望高手指正


    ----------------------
    curllion
    QQ:35277427
    MSN:curllion@MSN.COM

    2009年2月28日 16:15

全部回复

  • 首先,你要明白使用分页的场合,例如,如果是查询,就没有必要缓存了,因为每个查询的关键字一般是不同的,所以,这样的功能最好使用存储过程进行优化查询。而不是缓存

    其次,如果你的数据都是固定的,比如,显示新闻的列表,只有一套数据,从缓存里面取出来之后,自己分页完全是可以,如DataTable。

    缓存依赖技术其实也就是Cache,只不过更新缓存的时刻依赖于某种条件,如sql数据库里面的数据变了,或者文件内容修改了,则重新取数据再缓存起来。

    孟宪会
    2009年2月25日 6:36
    版主
  • 我的功能是类似于新闻列表,数据量很大,但是更新又频繁,如果不使用缓存,会给数据服务器造成很大的负担,所以想使用缓存技术.减轻服务器负担,数据缓存依赖技术通过配置SQL服务器和web.config. 最后在页面增加缓存代码

     <%@ OutputCache Duration="120" VaryByParam="none" SqlDependency="QiGuShow:cachetest" %>

    就可以实现,这个过程中我只是通俗的执行了一个查询语句,连CACHE放什么地方都不知道...可能是太菜了. 汗!
    2009年2月25日 6:55
  • 我就是想知道这个数据实现分页....

    2009年2月25日 6:56
  • 1,如果可能,建议生成静态页面比缓存要好。
    2,数据量很大,缓存也是很耗费资源的,可能还不如采取存储过程来分页来得好,存储过程分页网上有很多人写的不同版本,可以参考,另外sql 2005也有一个现成的函数RowNumber等实现分页。这个功能可以参考

    http://www.google.cn/search?hl=zh-CN&q=ql+server+2005+%E5%88%86%E9%A1%B5&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f&oq=

    3,Cache的代码实现:

    DataTable news;
    if(Cache["key"] == null)
    {
     //重新从数据库查询,得到DataTable等,比如是news
    Cache.Insert("key",news);//另外还有 Add方法,两者是不同的,具体可以看msdn文档
    }
    else
    {
    news = (DataTable)Cache["key"];
    }

    这时候数据已经存在了,你可以计算当前显示的页数,然后循环 news到当前页。

    这种办法我觉得不是很好。
    不如前面的方法好



    孟宪会
    2009年2月25日 9:48
    版主
  • 可以这样,将新闻的ID与更新时间单独放在一个表中,此表可以建个索引,用来提高查询效率
    然后查询的时候按时间降序排列
    假设每页的页数是P,要查第N页的数据
    那么,通过游标取得从第N*P条开始的N条数据,就是N 个ID了
    再根据这N个ID得到N条新闻
    再把这N条新闻传到客户端

    在我的博客中有个类似的分页的例子:
    http://blog.csdn.net/curllion/archive/2006/04/18/667735.aspx

    不知我的建议合不合理,还望高手指正


    ----------------------
    curllion
    QQ:35277427
    MSN:curllion@MSN.COM

    2009年2月28日 16:15