想请教高人,我现在做的一个系统,基于Struts,所用数据库是SQLSERVER2000,现在遇到的问题就是分页查询,原来的实现是组合查询结果放到一个ArrayList中,然后将List放到Session中,在页面进行分页处理,当数据量小的时候没什么问题,可现在数据量很大3W以上,会报java heap space 错误,想寻求另外一种分页查询,一种是每次翻页都查询一次数据库或者一次读取和缓存如干页数据。想找人说说自己的设计思想,或有没有代码之类,最好考虑到我开发的代码,因为好多处地方都要改,希望重用性高。

解决方案 »

  1.   

    select name from tab limit 0,10
    动态修改0,10这个参数就可以实现分页 
    不同数据,分页实现机制有所不同的
    如果用hibernate的话,可以屏蔽这些限制
      

  2.   

    你所指的limit 是mysql下才能这样写 我用的是SQLSERVER2000 没这个,现在主要是想每翻一次页查一遍库
      

  3.   

    JDBC连接的话需要设置ResultSet敏感滚动,把游标滚动到最后一行获取表中的行数
    获得所有的行数后再加以计算循环取出你所需要的数据,每页显示多少行数据则取多少行。
      

  4.   

    可以用hibernate中的query查询时候的方法setFirstResult()方法和setMaxResult()方法呀
      

  5.   


            Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null; // 每页行数
    private int pageSize = 5;
    // 页数
    private int pageNum = 0;
    // 第几页
    private int pageId = 1;
    // 总共有多少行
    private int num = 0; // 省略字段的get set方法
             // 获取每页数据的业务方法
    public List getData(int pageId,String sql) throws Exception {

    conn = DB.getConn();
    stmt = DB.getStmt(conn); //注意Statement的生成方式为:Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    rs = stmt.executeQuery(sql); // 游标移到最后
    rs.last();
    // 获取总计录数
    this.num = rs.getRow();
    this.pageNum = num / 4 + (num % 4 > 0 ? 1 : 0);

    // 赋初值
    this.pageId = pageId;
    if (pageId < 1) {
    this.pageId = 1;
    } else if (this.pageId > this.pageNum) {
    this.pageId = this.pageNum;
    } rs.beforeFirst();
    for (int i = 0; i < (this.pageId - 1) * this.pageSize; i++) {
    rs.next();
    }

    ArrayList allDate = new ArrayList();
    for (int j = 0; j < this.pageSize; j++) {
    Javabean bean = new Javabean();
    if (!rs.next()) {
    break;
    }
    bean.setXXX(rs.getXXX());// 装载对应的数据
    allDate.add(book);
    } return allDate;
    }
      

  6.   

    Hibernate 是个不错的选择~!
      

  7.   

    SELECT TOP 页大小 *
    FROM table1
    WHERE id NOT IN
              (
              SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
              )
    ORDER BY id
      

  8.   

    sqlserver分页代码,我不会,好像挺麻烦的。hiberate支持分页的,试试吧。另外还有个差劲的办法:
    全部查出来,读取resultset的时候这样:
    int i=0; 
    while( i<要读取的起始行 ) {
       i++; //不读取resultset
    }for( int i=0; i<读取行数&&rs.hasNext(); i++ ) {
       读取resultset;
    }
    --------------
    细粒度权限管理
    www.metadmin.com 
      

  9.   

    数据多的话得据页码去查询,一次只取固定条数。
    比如一页显示10条,让显示第二页:
    select top 20 * from table1 where id in (select top 20 id from table1) and id not in (select top 10 id from table1);
    比较好的是用hibernate中的分页:
      Query q = session.createQuery("from Cat as c");
      q.setFirstResult(20000);
      q.setMaxResults(100);
      List l = q.list();
      

  10.   

    用hibernate吧~~里面query类中有两个方法可以用~
      

  11.   

    不能把它放在Session中,它会一直占用内存,数据量大就会卡死的
      

  12.   

    session 中一般就放登陆后用户的信息的,别的东西最好不要放session里面,
     你可以做一个自定义分页标签,代码有点多,我也不给你了。  虽然做起来有点麻烦 但是项目中用到的多的话,还是很好的
      

  13.   


    可惜我们的系统没用hibernate
      

  14.   

    我的资源里有个javabean分页源码,楼主可以去参考下
      

  15.   

    ResultSet.TYPE_SCROLL_INSENSITIVE会影响性能,因为它是把结果集一次性存放在jvm中如果不需要计算总数的话可以把他改为TYPE_FORWARD_ONLY或者在另写一个查询总数的sql