参考
http://www.csdn.net/expert/topic/300/300403.shtm

解决方案 »

  1.   

                     int count=0;//记录总数
                     int pagecount=0;//总页数
                     int pages=0;//当前页
                     int pagesize=100000;//每页显示的记录数
                     rs=DBop.executeQuery(szSql);
                     while(rs.next())
                      {count++;}
                     rs.close();
                     if(count%pagesize==0)pagecount=count/pagesize;
                     else pagecount=count/pagesize+1;
                     String szPages=request.getParameter("pages");
                     if(szPages==null) pages=1;
                     else{
                       pages=new Integer(szPages).intValue();
                       if(pages<=0) pages=1;
                         }
                     int first=(pages-1)*pagesize+1;
                     int last=first+pagesize-1;
                     rs=DBop.executeQuery(szSql);
                     for(int i=1;i<=(pages-1)*pagesize;i++) {rs.next();}//将指针指到每页的首记录
    下一页按钮 
    a href="more1.jsp?pages=<%=(pages-1)%<img border=0 height=21  src="../images/sbutton-backpage.gif" width=59></a>
      

  2.   

    主  题:请问大家编分页显示都用的什么方法?(如何读取数据库,保存结果)
    作  者:redstarstar
    所属论坛:Java
    问题点数:50
    回复次数:21
    发表时间:2001-9-24 14:44:49
     
      
      今天做个项目,数据库中有几十万条记录,查询显示的结果也有几万到十几万的记录,所以我原来的分页显示就用不了了(方法太笨:又耗资源,又慢)。 
    不知大家都是如何进行分页的,并能够适合我这种大数据量的情况! 
    主要困扰我的问题:如何加快速度?几十万条的纪录查一次很费时间,我不想每次在不同的页码间跳转时都查一次数据库,但又不可能在第一次查询时就将所有的结果保存起来(我试过出现out of memory)。谁有好办法吗???  
    回复贴子: 
    回复人: hexiaofeng(java爱好者) (2001-9-24 14:53:33)  得0分 
    可以设置 数据库指针  
    回复人: kangaroo(名草) (2001-9-24 14:55:34)  得0分 
    关注!!!!!  
    回复人: redstarstar(红星星) (2001-9-24 14:57:10)  得0分 
    目前我的想法是:每次存储部分查询结果:每页显示数目*10;当用户点击显示下10页时,再存储接下来的:每页显示数目*10。这样可以解决将查询结果全部存储耗费资源的问题,和在每10页切换时速度的问题。
    大家有什么高见吗?  
    回复人: redstarstar(红星星) (2001-9-24 15:00:00)  得0分 
    关于指针和resultset,我觉得涉及一个与数据库连接的问题,如果我保存resultset,那我何时关闭与数据库的连接呢,总不能用户查询一次我就开一个连接呀!这样很快就会达到最大连接的!  
    回复人: wilddragon(帅帅) (2001-9-24 15:42:35)  得0分 
    期待答案  
    回复人: hexiaofeng(java爱好者) (2001-9-24 15:45:26)  得0分 
    在本页显示完毕,就关闭连接  
    回复人: redstarstar(红星星) (2001-9-24 16:38:32)  得0分 
    如果用游标或resultset的话,好像无法在本页就关闭连接吧!  
    回复人: redstarstar(红星星) (2001-9-24 16:54:19)  得0分 
    没有高手吗????  
    回复人: hegum(hg) (2001-9-24 16:57:11)  得10分 
    有本书叫 Java servlets什么的,我记不清楚拉,你到网上书店查吧,里面有个好例子!!!!!!!!!  
    回复人: X25(X25) (2001-9-24 16:59:48)  得10分 
    CREATE PROCEDURE SP_GetauthorPage(
    @CurrentPage int,
    @PageSize int
    ) AS
    declare @sSQL1  varchar(500)
    declare @sSQL2  varchar(500)
    declare @iCount  int
    declare @PageCount int
    declare @RecordCount intset @iCount=@CurrentPage*@PageSize
    print @iCountselect @RecordCount=Count(*) from  author
    print @RecordCountif  @RecordCount >0  
    begin
    if @RecordCount % @PageSize=0
    begin
    set @PageCount=@RecordCount/@PageSize
    end
    else
    begin
    set @PageCount=@RecordCount/@PageSize+1
    end
    if @CurrentPage<=@PageCount and @CurrentPage>0
    begin
    set @sSQL1='(select top '+ ltrim(rtrim(str(@iCount))) +' * from author order by au_lname ) as tmp'
    --print @sSQL1set @sSQL2='select top ' +ltrim(rtrim(str(@PageSize)))+' * from '+@sSQL1 +' order by au_lname desc '
    print @sSQL2EXEC(@sSQL2)
    end
    else
    begin
    select top 0 * from author
    endend
    else
    begin
    select * from author
    end
    GO  
    回复人: hegum(hg) (2001-9-24 17:00:41)  得0分 
    Java开发指南——Servlets和JSP篇
        (美)Bill Brogden/ 7-5053-6658-0/电子工业出版社  
    回复人: redstarstar(红星星) (2001-9-24 17:23:09)  得0分 
    我只要大家给个最可行,最实际的思路和方法就可以了,编程我自己来就行了。
    to hegum(hg):
    你能告诉我那本书里例子的思路吗?  
    回复人: tiangou(分数不多就去灌水乐园) (2001-9-24 17:39:21)  得10分 
    我也在做这样的事,我用的是java servlet 网页显示,我是这样的处理的,用存储过程将记录取出来,定义一个Vector()矢量,用rs.next()!=null将rs中的记录取出来放到Vector中,再将Vector放到session中,分页显示时从session中取数据,你有足够大的内存就可以了,我的记录控制在2000条内。还有我想问一个很简单的问题:如果查询记录有几万到几十万条,即使你实现了分页显示,就当你一页显示100条,那你至少也要一百多页,那你怎么知道你所要的在哪一页?这样做有意义么?
     
    回复人: redstarstar(红星星) (2001-9-24 18:32:17)  得0分 
    我最早也是采用你那种方法,即将所有的纪录全部取出来,存在Vector中,我是把vector放在了一个bean中,但那会我们数据库中最多才3000多条记录。现在已经有10几万的记录了,所以将纪录全部取出,就造成了out of memory!
    你觉得我后来的方案如何呢?(14:57分发的那个)这点我也想过,所以我还会再做一个功能,就是在以得到结果中的再次查询(怎么实现还没想好)  
    回复人: redstarstar(红星星) (2001-9-24 21:45:33)  得0分 
    up!  
    回复人: yorkchen(天同) (2001-9-25 14:08:41)  得0分 
    存储过程支持分页查询
    存储过程做查询时 一次只查回 想要的第几条到第几条
     
    回复人: lick(谁能告诉鹰在空中的路……) (2001-9-25 14:19:02)  得10分 
    在jdbc里采用sql语句解决,每次翻页查询数据库,取出每次所需要的几条数据,一个sql轻松解决,前提是获得已经获得所有的页数,包括你的记录总数
    采用vector解决对于数据量小比较合适,大数据量不行,一次查询放到session里,如果用户量很大,服务器可能撑不住  
    回复人: bobokong(寻找编程的乐趣) (2001-9-25 17:47:31)  得10分 
    是不是可以这样整个网站用一个JavaBean,里面存所有的几十万条数据(可以用Vector),所有的查询从它里面取
    然后再做一个JavaBean用来访问上面一个JavaBean,提供一些方法来实现分页查询。
    做一个类似监听器的程序,如果数据库有更新,就自动的更新第一个JavaBean.缺点,如果类似的分页页面很多就特别耗内存,但只有一两个应该行吧?
     
    回复人: bobokong(寻找编程的乐趣) (2001-9-25 17:51:18)  得0分 
    另一个参考www.google.com,楼上有人题过
    每次取十页放在Session中,十页十页的从数据库中取。
    页面上可以提供 前十页 1 2 3 4 5 6 7 8 9 10 后十页缺点速度稍慢,
     
    回复人: rox(rox) (2001-9-25 18:26:14)  得0分 
    关注!  
    回复人: hegum(hg) (2001-9-29 16:26:22)  得0分 
    我觉得你还是应该看看
    Java开发指南——Servlets和JSP篇
        (美)Bill Brogden/ 7-5053-6658-0/电子工业出版社 
    里面有连接池等提高性能的东西!可惜我没有这本书,以前在学校图书馆看的