如题
现在做的一个网站有个项目和新闻
大概的数据都是9000以上
如果采用数据库分页  可能导致数据库频繁访问  服务器压力大  (类似门户站)
如果采用记录集的自带的分页  数据太多  客户机和网络压力 又太大昨天查了一下午网上的资料
有个思路:首先在数据库里分页  比如分1000条一页  (即一次查询1000条)
          然后,从返回的1000条数据里进行记录集分页
问题:如何当用户点到最后一页的时候(即当前1000条记录,分出来的最后一个页的页码时再次调用数据库分页。同时,如果用户点了最后一页应该是显示总共9000条记录的最后一页还是????)

解决方案 »

  1.   

    最后一页应该是8000后的1000条,分页的话用Hibernate里的分页或者Spring里的分页工具类试试
    水平不高顶下
      

  2.   

    补充说明:
    整个程序客户要求是jsp+javabean(servlet)
    不要求使用框架
    所以希望最好是纯jsp(java)  不要框架
    而最后一页的话  我想  最好能够是整个9000条记录的最后几十条(比如每页是显示20条,那我希望是8981到9000这20条)请高手指点下
      

  3.   

    前端加一个squid,缓存就行了吧
      

  4.   

    需要呈现多少数据就从数据库中取多少条数据,
    网上有很多关于分页的BEAN的源码,看看就好。
      

  5.   

    那就写条SQL语句,得到最后1000条了个人认为还是数据库SQL语句对记录分好,不要全部查出来在分当然全部查出来再分也可以(放进缓存),前提是数据不常更新。
      

  6.   

    直接分页啊  用SQL语句控制多好  
    select top [pagesize] * from table where id not in ( select top [pagesize*(currentpage-1)] id from table [查询条件] order by id ) and [查询条件] order by id你查全世界人的 DNA排列都 没问题
      

  7.   

    用sql分页较多,楼主的做法没有做过,希望能得到答案
      

  8.   

    9000条也敢说是大数据
    俺们100多万条的表,用sql分页,没问题的
      

  9.   

    昨天下午查资料有看到之前的一个帖子有个高手说了先数据库分页查  比如数据库分页每次查出1000条
    然后再把这个返回的1000条用记录集的分页去分
    但是这样的话   怎样在点下一页 末页的时候进行处理呢?PS:以每页显示20条记录为例
    问题一:当我点下一页的时候,page已经为50了  那摸这个时候就要调用数据库分页,再次查询1000条记录到记录集中进行分页。然后总页数这些应该怎摸处理。
    问题二:同理,当我点上一页从第51页返回到第50页的时候怎摸处理?
    问题三:点末页和首页的时候到底显示的是总记录的最开始的20和最后20条还是当前筛选出来的1000条中的开始的20条和末尾的20条。
      

  10.   

    数据库分页sql语句,每次只查询需要的条数。
    但是一旦总数据量大了的话,也有效率问题。
      

  11.   

    问题:如何当用户点到最后一页的时候(即当前1000条记录,分出来的最后一个页的页码时再次调用数据库分页。同时,如果用户点了最后一页应该是显示总共9000条记录的最后一页还是????)你这样的需求好像就有点儿复杂了,你想先数据库分页,然后页面中在对记录集分页,提供最后一页的链接,点击时显示的是哪个最后一页?
    呵呵,听了你的问题,我决的只能靠代码控制了。
    首先数据库分页封装到记录集中,前台再对记录集分页显示,但是此时有一个问题,其实也是看你的需求了,我要是改变每页的显示条数的话,假如原来是每页10条,我显示100页就OK了,可是我改成每页30条,那再从这1000条记录集中分页的话,想想可就复杂了啊,需要做几个判断……
    我觉得,这样的设计对自己或用户都不是太好的设计。
    这样子,楼主又考虑到分页效率的问题,那我觉得,是不是可以借助一些分页控件,可能他们内部的控制,会比我们代码控制要好一些吧!
    推荐一个:pager-taglib,不依赖任何框架,jdbc就可实现。
    如有其它好的实现方式还望多多交流……
      

  12.   

    用多少查多少。// 数量sql
    public String getCountSql(String strwhere){
        String sqlstr ="select count(*) from table";
        if(!"".equals(strwhere) && strwhere != null){
            sqlstr =sqlstr+" where "+strwhere;
        }
        return sqlstr;
    }
    // 记录sql:currpage当前页;rowsPerPage每页显示多少行
    public String getListSql(int currpage,String strwhere,int rowsPerPage){
        String sqlstr="select Top "+rowsPerPage+" id,name" ;
        sqlstr = sqlstr + " from table";
        sqlstr = sqlstr + " where (id not in(select top " + rowsPerPage * (currpage - 1);
        if("".equals(strwhere)){
            sqlstr = sqlstr + " id from TBdaby  order by id desc)) ";
        }
        else{
    sqlstr = sqlstr + " id from TBdaby where " +strwhere+ " order by id desc)) And "+strwhere;
        }     
        sqlstr = sqlstr + " order by id desc ";
        return sqlstr;
    }
    改成StringBuffer连接字符串。
      

  13.   

    需要 9000+ 条数据同时显示么???
       在9000+ 条数据中 人工找需要的数据....  晕死...
    如果需要对9000+的数据做分页, 
    建议楼主研究研究 baidu 和 google 的搜索结果展示.. 当搜索结果到上万条的时候是如何处理的.. 一看就明白..
      

  14.   

    数据量很大,肯定要分页,在真正得到结果之前是要先查处满足条件的总记录数,再根据分页大小计算出多少页(这个时候并没有把满足条件的所以数据都拿来,只是索引一下总数),比如每页20条,那开始就查出top 20,在下一页就top 40等。不然你内存哪够用。
      

  15.   

     把所有记录查出来 用List装 返回到页面的时候用session保存着个list对象,
     比如像这样:
     List newList = rvolist.subList(((result.getPageNum()-1)*this.pagesize+1)-1, maxValue);
      

  16.   

    page-taglib需要传递一个list进去
    那我在查询的完成之后还要包装进一个list
    那样效率高吗?我承认自己水平不牛,所以我才在碰到问题的时候来提问,如果你那个100W数据翻到任意页就7,8秒,那我觉得挺好了,我很满足,不过能否提供代码例子呢?我来提问是来请教问题,并没有显摆什么。愿意交流探讨,或者帮助的欢迎!!谢谢
      

  17.   

    分页首先要做好的就是数据库设计,如何减少IO操作,如何拆分数据之类的,再就是SQL的优化了,建议是一页多少就查多少吧。
      

  18.   

    分页这个东西完全都不难
    例如一页100条,传一个“页数”参数过去;
    select  xxxxxx     limit (页数-1)*100,100;查出来显示就是了复杂点的,就是底下那个  第 2,3,4,5,6,7  页  这个东西算法要想一下;因为第18页  就是  15,16,17,18,19,20,21偷懒的话就用下拉框把全部页码显示出来;
      

  19.   

    用hibernate分,SQL分,按需取出数据量
    Session session=getSession();
    Query q=session.createQuery(sql);
    q.setCacheable(true);
    q.setFirstResult(page*pagecount);
    q.setMaxResults(pagecount);
    List list=q.list();
    session.clear();
    session.close();
    return list;
      

  20.   

    怕有压力就做静态页吧,前提也是数据更新量不大,
    分页方式可以参考:http://news.sohu.com/1/0903/61/subject212846158.shtml
    这种算法还是比较方便的
      

  21.   

    9000条数据查询速度都慢的话,先不要寻找SQL查询,看看数据库结构设计,应该是设计的不合理,否则这点数据不会影响一点速度的!
      

  22.   

    我汗
    首先,那个思路也是搜索论坛在之前的一个帖子里看的  先数据库分页再记录集分页然后感觉还是支持数据库分页的多点,不过我也说了自己的那个替代想法很同意 bao110908  说的
    用户不大可能去一条条的看一直从第一条到第1000条所以我的替代想法中不是说了  分页我只提供最新的几百条
    其他再提供一个精度比较高点的查询,这样能够有效的缩小数据范围
    不过,具体怎摸做还要看客户的意思
    不是我可以决定的很感谢大家的支持,这摸多人参与讨论希望能有新的思路啊!  毕竟这个东西用的地方还是蛮多的最好提供思路的同时能给出例子程序,方便我们学习,提高自己
      

  23.   

    CSDN也太烂了吧。。一个那么小数据量的分页讨论那么久没结论。真晕!
      

  24.   

    数据量大的话,用记录集分页不是个好方法.
    在数据库做分页还是比较好的,需要多少查询多少.hibernate针对一部分数据库的分页采用的是临时表(比如DB2);
    如果担心数据量大了,数据库分页的效率问题,这个是任何大数据量应用都会遇到的问题,那就要调整架构\索引\数据库散列\分布式存储等架构问题了.目前还是建议楼主使用数据库分页.如果mysql的话,可以使用select top 的方式;如果是DB2的话,考虑一下临时表.
      

  25.   

    楼主可以把问题简化一下考虑..
     建设现在总共有 10 条数据每个页面最多显示 3页数据
    每页最多显示2条数据..保存在数据库中的数据一共 10 条
    一次从数据库中读取3页数据 = 3 X 2 = 6 条
    每页显示2条:  对6条数据进行分页,  每次显示有3页...
    之前给楼主说的看google对搜索结果的处理,, 貌似楼主压根就没看.....   1.在分页的时候首先需要知道数据库中总共有多少条记录,     例如例子中 总共有 10 条
    2.需要知道每个页面显示多少条数据,     例如例子中 总共有 2 条
    3.一次给用户展示多少页:              例如例子中 总共有 3 页那么这个流程就很清晰了....晕死, 下班了.  楼主先自己想着...   要是还想不明白 回头再议..
      

  26.   

    又想到了!对于实时性要求很高的,前面几页用普通的SQL分页方式,后面到了某一部分的时候使用那种结合式的分页!呵呵
      

  27.   

    用ROWNUM 查询如下例子:
    select productname,proid,ADDTIME,prodetail from (select productname,proid,ADDTIME,prodetail,rownum rn from sys.tblproduct where rownum<="+(intPage*intPageSize)+" order by proid desc) t where rn>="+ ((intPage-1)*intPageSize+1) +" order by t.proid desc ";
      

  28.   


    谷歌的搜索这种看过
    但是具体的实现不是很清楚
    只是用page-taglib模拟过  
    能否详细解释下这种分页的处理方式,或者给部分例子代码学习PS:认为此问题垃圾的可以自己离开,我提问只是因为自己不懂,想请人帮助   
    骂人的自己认为自己有多行?
    谁不是从碰到问题到解决问题的过程得到提升的?很感谢参与讨论并提出自己意见的朋友
      

  29.   

    补充下:数据库采用的SQL2000   
    所以limit rum等mysql和Oracal内部的这些应该不能用吧