不是分页技术,而是你的读取数据的思路有问题?要用到的数据用SQL语句查,如你要显示第3页的数据,就查找第3页的数据,不要全部读取应该使用连接查询和子语句查询贴出你的SQL语句是怎么写的?
解决方案 »
- 与SQL server连接 出现了点问题 各位帮我看下吧
- jqgrid如何在CELLEDIT模式下取得值
- 悲剧了悲剧了
- 模糊查询和精确查询的问题
- for(String file : filelist)这个是什么用法??
- 大家平时是用哪个技术blog的?
- 请问在JB里面怎样调试EJB阿?
- eclipse + hibernate
- 用J2EE做网上编程系统,高手进,高分!!
- WebLogic7配置Oracle8i数据库连接池问题
- 对http://www-900.ibm.com/developerWorks/cn/java/l-hibernate2/里多对多关系的几个疑惑?
- 用commons-fileupload实现上传的代码的调试。
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;
}
}写到这里我想你应该知道了吧
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下测试)
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语句,就不行了吗?
http://blog.csdn.net/wellknow/archive/2004/07/29/55167.aspx
最原始的讨论在大富翁论坛里面,我现在找不到了。
我们经过测试了的,速度确实比一般的分页存储过程以及使用游标的存储过程都快很多。
要么是在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());
}