不是分页技术,而是你的读取数据的思路有问题?要用到的数据用SQL语句查,如你要显示第3页的数据,就查找第3页的数据,不要全部读取应该使用连接查询和子语句查询贴出你的SQL语句是怎么写的?

解决方案 »

  1.   

    下面是一个游动查询的代码,可能正是你需要的。
    String pages = request.getParameter("page") ;//接收JSP页面传来的参数,表示第几页int i=1;
    int numPages=20;              //显示条数
    int nextPage ;                //下一页
    int upPage;int currentPage = 1;
    currentPage=(pages==null)?(1):(Integer.parseInt(pages));//当前页
    int intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);//总页数if(currentPage>intPageCount) currentPage=intPageCount;
    nextPage = currentPage+1;
    if (nextPage>=intPageCount) nextPage=intPageCount;
    upPage = currentPage-1;
    if (upPage<=1) upPage=1;sql="select * from FZDTB order by ID DESC";
    vec=fkind.getTitleId(sql,numPages,currentPage);    fkind是一个类,负责进行游动查询:package javabean;import java.util.Vector;
    import java.sql.*;public class Fkind 
    {
    private Statement stmt=null;
    private ResultSet rs=null;
    private Connection con=null;
    private ConnectionPool pool;

    public Fkind(){
    pool=ConnectionPool.getInstance();               //初始化连接池
    }

    public Vector getTitleId(String sql,int numPages,int currentPage) throws SQLException
    {
      
      int count=numPages;     
      Vector vec=new Vector();  
      try 
      {     
      
      con=pool.getConnection();
      stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
      rs=stmt.executeQuery(sql);
      rs.absolute(numPages*(currentPage-1)+1);
      
      while(count>0)
      {
      Shown show=new Shown();           //show是一个模型
      show.setTitle(rs.getString("TITLE"));    
      show.setId(rs.getInt("ID"));
      show.setDate(rs.getString("PUBDATE"));
      vec.add(show);
      if(!rs.next()) break;
      count--;
       }
       rs.close();
      }  
      catch (SQLException e) { return null;}
      con.close();
      return vec;   
    }
    }写到这里我想你应该知道了吧
      

  2.   

    通常你可以常用好几种分页技术。
    1、对于数据量不大(<10000条)的情况下,你可以采纳楼上的技术:也就是通过sql语句得到一个ResultSet rs,定位游标,然后取出需要的记录数。(30000条记录取10条平均31秒)
      但是这种方法,在对大数据量的表进行查询的时候,速度爆慢,因为(Select * from TableA)将使得ResultSet rs这个对象非常大,占据很大的内存,这种性能在并发的情况显得尤其严重,甚至有可能导致缓冲区溢出。
    2、基于上述的原因。你应该这样做:
      step1:取得针对主键的ResultSet(select pk from TableA),这样一方面rs将大大缩小,而且因为主键的查询是一个索引查询,速度将非常快。
      step2:利用游标,取出相应的主键,缓存Array[]
      step3:利用Array[]构建一个sql语句,形势类如:select * from TableA where pk=? or pk=? or ... pk=?(30000条记录取10条平均3秒)
    3、如果你不写sql语句,比如利用EJB CMP技术,分页查询的时候只要设置一个offset的变量值,
    然后调用相应的抽象实现,就可以完成分页操作,这种速度是最快的。。(100000条记录取10条平均300毫秒,jboss下测试)
      

  3.   

    exec = "SELECT TOP "+ PerPage +" a.* "
    exec += " FROM News a "
    exec += " WHERE a.NewsId < all("
    exec += "SELECT TOP "+ PerPage * (page-1) +" NewsId FROM News +" order by ReLastNewsId desc)"
    exec += " order by a.ReLastNewsId desc"PerPage  每页记录数
    page  第几页直接构造一个带子查询的SQL语句,就不行了吗?
      

  4.   

    [百万级]通用存储过程.分页存储过程. 
    http://blog.csdn.net/wellknow/archive/2004/07/29/55167.aspx
    最原始的讨论在大富翁论坛里面,我现在找不到了。
    我们经过测试了的,速度确实比一般的分页存储过程以及使用游标的存储过程都快很多。
      

  5.   

    对头。分页要么是把数据全部取出来在jdbc里面用游标来实现。
    要么是在sql里面做数据库分页。
    前者对内存要求大,适合小数据量。
    后者对内存要求小。但是对数据库的负担大。
    我个人认为如果实在是很大的话。就做一个专门的字段来做分野。
    下面是sql的构造方法。是oracle里面的
    try {
      int i = curPage - 1;
      String query = null;
      query = "select * from (select * from (" + sql + ") where rownum<=" +
      this.perPage * this.curPage + " minus select * from (" + sql +
      ") where rownum<=" +
      this.perPage * (this.curPage - 1) + ") " + this.orderBy;
      System.out.println(query);
      rs = mydb.executeQuery(query);
    }
    catch (Exception e) {
      System.out.println(e.getMessage());
    }
      

  6.   

    不知道有没有oracle 的这样的存储过程。
      

  7.   

    http://blog.joycode.com/percyboy/archive/2004/09/14/33445.aspx
      

  8.   

    http://www.delphibbs.com/delphibbs/dispq.asp?lid=1083587