关于大量数据分页显示问题

wujun518 2008-01-13 01:46:57
不知道大家用过什么样的分页控件
我用过displayTag 做过分页,现在出现问题了
如果要分页的数据量太大(10万条)就会报内存溢出
大家,谁有好的分页控件没有,虚心象大家请教 !
...全文
287 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sellcoffe 2008-01-16
  • 打赏
  • 举报
回复
如果这种方法可以的话,你可以自已再改改代码,这个基本上可以通用了
sellcoffe 2008-01-15
  • 打赏
  • 举报
回复
我用的分页方法就是使用子查询,在数所库端进行的,我写过三种分页的方法,上面的代码分页效率应该还行,要哪页就在数据库查哪页,以前最开始用的就是全查出来放到List中,直接对List进行操作,这个效率比较低,还是用数据库的子查询比较好.这种方法我使用过10万条以上数据进行过测试,相当快.
wujun518 2008-01-15
  • 打赏
  • 举报
回复
有用过display的动态分页显示吗?
今天看了一下 ,是应该可以的,不过没有定向到具体是哪页的功能!
hahe7788 2008-01-14
  • 打赏
  • 举报
回复
按有几个群,你不妨加进去,可以和大家一起讨论啊.........46986340,28039577,4804620
在那里看看有无能回答你的,谢谢,LZ,甭忘了给俺分哦,谢谢LZ
淡定的峰哥 2008-01-14
  • 打赏
  • 举报
回复
另外Hiberbate也有分页的方法
淡定的峰哥 2008-01-14
  • 打赏
  • 举报
回复
效率最高的是数据库端分页,你那displayTag 是把所有的数据都取出来放在缓存中,数据多了当然慢拉
Oracle分页的语句为:以scott.emp为例
select * from (select a.*,rownum nu where rownum<=end)y where y.nu>=start
//end为每页的最后一条记录,start为每页的第一条记录
sql server 的分页语句为:以northwind.customers
select top PAGE_SIZE * from (select top end * from customers order by customerID desc)a order by a.customerID
//end为每页的最后一条记录,PAGE_SIZE为每页的记录条数
wujun518 2008-01-14
  • 打赏
  • 举报
回复
现在还没来的及看,先谢谢你,有机会一定好好向你请教 !谢谢 !
sellcoffe 2008-01-13
  • 打赏
  • 举报
回复
这个分页组件是我自己写的,不知道适不适合你的要求,这只是我写的其中一种,这种我试过了,数据量就是在10万以上,反映都很快,当然这个还可以再进行改进,JSP里面有些程序应该是放到servlet中去写的,这个写法也是按照MVC模式来写的,楼主看看,看能对你所启发不.
sellcoffe 2008-01-13
  • 打赏
  • 举报
回复
试试这个怎么样
DAO:SrcTypeDao.java

package test1.splitpage.xxx;

import java.sql.*;
import java.util.*;

public class SrcTypeDao {

public Vector findbyAll(Connection _conn,SplitPageCommon spvo,String sqlw) {
Vector v = new Vector();
// 定义 存放SQL语句的 StringBuffer
StringBuffer sbSQL = null;
// 定义 PreparedStatement
PreparedStatement ps = null;
PreparedStatement psCount=null;
// 定义数据库链接
Connection conn = null;
ResultSet rs = null;
ResultSet rsCount=null;

try {
conn = _conn;

//查出总共的记录数
psCount=conn.prepareStatement("select count(*) from SRC_TYPE");
rsCount=psCount.executeQuery();
while(rsCount.next()){
//得到总记录数
spvo.setTotalRecord(rsCount.getLong(1));
}
//总页数
spvo.setTotalPage((spvo.getTotalRecord()+spvo.getPageRecord()-1)/spvo.getPageRecord());
//System.out.println("总记录数:"+spvo.getTotalRecord());
//System.out.println("当前页:"+spvo.getCurPage());
//System.out.println("每页记录数:"+spvo.getPageRecord());
// 拼写sql
sbSQL = new StringBuffer();
sbSQL.append("select top "+spvo.getPageRecord()+" * from src_type where id in( ");
//sbSQL.append("select top "+spvo.getPageRecord()+" * from src_type where exists ( ");
sbSQL.append("select top ");
if(spvo.getTotalRecord()-(spvo.getCurPage()-1)*spvo.getPageRecord()>=0){
sbSQL.append(spvo.getTotalRecord()-(spvo.getCurPage()-1)*spvo.getPageRecord());
}else{
sbSQL.append(0);
}
sbSQL.append(" id from src_type order by id asc");
sbSQL.append(") ");
sbSQL.append(sqlw);
sbSQL.append(" order by id desc");
// 获得 数据库 prepareStatement
//System.out.println(sbSQL.toString());
ps = conn.prepareStatement(sbSQL.toString());
// 执行SQL
rs = ps.executeQuery();

while (rs.next()) {
SrcTypeVo vo1 = new SrcTypeVo();
vo1.setID(rs.getDouble("ID"));
vo1.setT_ID(rs.getString("T_ID"));
vo1.setT_NAME(rs.getString("T_NAME"));
vo1.setT_TYPE(rs.getInt("T_TYPE"));

v.addElement(vo1);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
// 关闭 ps
if (ps != null) {
ps.close();
ps = null;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
return v;
}

}

VO:SrcTypeVo.java

package test1.splitpage.xxx;
public class SrcTypeVo{
double ID;
public double getID(){
return this.ID;
}
public void setID(double str){
this.ID=str;
}
String T_ID;
public String getT_ID(){
return this.T_ID;
}
public void setT_ID(String str){
this.T_ID=str;
}
String T_NAME;
public String getT_NAME(){
return this.T_NAME;
}
public void setT_NAME(String str){
this.T_NAME=str;
}
int T_TYPE;
public int getT_TYPE(){
return this.T_TYPE;
}
public void setT_TYPE(int str){
this.T_TYPE=str;
}
String parm="ID,T_ID,T_NAME,T_TYPE";
public String getParm() {
return parm;
}
public void setParm(String parm) {
this.parm = parm;
}
String parm1="T_ID,T_NAME,T_TYPE";
public String getParm1() {
return parm1;
}
public void setParm1(String parm1) {
this.parm1 = parm1;
}
String parm2="T_ID=?,T_NAME=?,T_TYPE=? where ID=?";
public String getParm2() {
return parm2;
}
public void setParm2(String parm2) {
this.parm2 = parm2;
}
}

BIZ:SrcTypeBiz.java

package test1.splitpage.xxx;

import java.sql.Connection;
import java.util.List;
import java.util.Vector;

public class SrcTypeBiz {
public List findbyall(SplitPageCommon spvo,String sqlw){
DBConnection dbc=new DBConnection();
Vector _v=new Vector();
if(dbc.getConnect()){
Connection conn=dbc.getConn();
try{
SrcTypeDao dao=new SrcTypeDao();
_v=dao.findbyAll(conn,spvo,sqlw);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(conn!=null){
conn.close();
conn=null;
}
}catch(Exception e){
e.printStackTrace();
}
}
}else{
System.out.println("数据库联接失败!");
}
return _v;
}
}

分页调用程序:SplitPageCommon.java

package test1.splitpage.xxx;
public class SplitPageCommon {
private long curPage = 1;// 当前页

private long pageRecord = 0;// 每页显示的记录数

private long totalRecord = 0;// 总记录数

private long totalPage = 0;// 总页数

private String url = "";

public void setCurPage(long curPage) {
this.curPage = curPage;
}

public long getCurPage() {
return this.curPage;
}

public void setPageRecord(long pageRecord) {
this.pageRecord = pageRecord;
}

public long getPageRecord() {
return this.pageRecord;
}

public void setTotalRecord(long totalRecord) {
this.totalRecord = totalRecord;
}

public long getTotalRecord() {
return this.totalRecord;
}

public void setTotalPage(long totalPage) {
this.totalPage = totalPage;
}

public long getTotalPage() {
return this.totalPage;
}

public void setUrl(String url) {
this.url = url;
}

public String getUrl() {
return this.url;
}

public static String SplitPage(SplitPageCommon vo) {
StringBuffer sbStr = new StringBuffer();
sbStr.append("<form method=\"get\" action=\"\">");
sbStr.append("第 " + vo.getCurPage() + " 页 / 共 " + vo.getTotalPage()+ " 页");

if (vo.getCurPage() <= 1) {
sbStr.append(" 首页 ");
} else {
sbStr.append("<A HREF=\""+vo.getUrl()+"?page=1\"> 首页 </A>");
}

if (vo.getCurPage() <= 1) {
sbStr.append(" 上一页 ");
} else {
sbStr.append("<A HREF=\""+vo.getUrl()+"?page=");
sbStr.append(vo.getCurPage() - 1);
sbStr.append("\"> 上一页 </A>");
}

sbStr.append("<input type=\"text\" name=\"page\" style=\"width:30px;\">  ");
sbStr.append("<input type=\"submit\" value=\"查询\">");

if (vo.getCurPage() == vo.getTotalPage()) {
sbStr.append(" 下一页 ");
} else {
sbStr.append("<A HREF=\""+vo.getUrl()+"?page=");
sbStr.append(vo.getCurPage() + 1);
sbStr.append("\"> 下一页 </A>");
}

if (vo.getCurPage() == vo.getTotalPage()) {
sbStr.append(" 尾页 ");
} else {
sbStr.append("<A HREF=\""+vo.getUrl()+"?page=");
sbStr.append(vo.getTotalPage());
sbStr.append("\"> 尾页 </A>");
}
sbStr.append("总记录数: "+vo.getTotalRecord());
sbStr.append("</form>");
return sbStr.toString();
}
}

JSP,此处为一个简单的调用,也可以将里面的代码写到servlet中,在JSP中调用即可

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="test1.splitpage.xxx.*" %>
<%
String path = request.getContextPath();
%>
<html>
<head>
<title></title>
<style type="text/css">
body{
font-size:12px;
}
a:link {
color: #FF9966;
text-decoration: none;
}
a:visited {
text-decoration: none;
color: #FF9966;
}
a:hover {
text-decoration: none;
color: #FF9966;
}
a:active {
text-decoration: none;
color: #FF9966;
}
</style>
</head>

<body>
<%
long curPage=1;
if(request.getParameter("page")!=null){
curPage=Long.parseLong(request.getParameter("page"));
}
SplitPageCommon spvo=new SplitPageCommon();
spvo.setCurPage(curPage);//当前页
spvo.setPageRecord(15);//每页记录数
spvo.setUrl(path+"/test.jsp");//地址
SrcTypeBiz biz=new SrcTypeBiz();
List list=biz.findbyall(spvo,"");
if(list!=null && list.size()>0){
for(int i=0;i<list.size();i++){
SrcTypeVo vo=(SrcTypeVo)list.get(i);
%>
测试:<%=vo.getT_NAME()%><br>
<%
}
}
%>

<%=SplitPageCommon.SplitPage(spvo)%>
</body>
</html>

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧