如题
现在做的一个网站有个项目和新闻
大概的数据都是9000以上
如果采用数据库分页 可能导致数据库频繁访问 服务器压力大 (类似门户站)
如果采用记录集的自带的分页 数据太多 客户机和网络压力 又太大昨天查了一下午网上的资料
有个思路:首先在数据库里分页 比如分1000条一页 (即一次查询1000条)
然后,从返回的1000条数据里进行记录集分页
问题:如何当用户点到最后一页的时候(即当前1000条记录,分出来的最后一个页的页码时再次调用数据库分页。同时,如果用户点了最后一页应该是显示总共9000条记录的最后一页还是????)
现在做的一个网站有个项目和新闻
大概的数据都是9000以上
如果采用数据库分页 可能导致数据库频繁访问 服务器压力大 (类似门户站)
如果采用记录集的自带的分页 数据太多 客户机和网络压力 又太大昨天查了一下午网上的资料
有个思路:首先在数据库里分页 比如分1000条一页 (即一次查询1000条)
然后,从返回的1000条数据里进行记录集分页
问题:如何当用户点到最后一页的时候(即当前1000条记录,分出来的最后一个页的页码时再次调用数据库分页。同时,如果用户点了最后一页应该是显示总共9000条记录的最后一页还是????)
水平不高顶下
整个程序客户要求是jsp+javabean(servlet)
不要求使用框架
所以希望最好是纯jsp(java) 不要框架
而最后一页的话 我想 最好能够是整个9000条记录的最后几十条(比如每页是显示20条,那我希望是8981到9000这20条)请高手指点下
网上有很多关于分页的BEAN的源码,看看就好。
select top [pagesize] * from table where id not in ( select top [pagesize*(currentpage-1)] id from table [查询条件] order by id ) and [查询条件] order by id你查全世界人的 DNA排列都 没问题
俺们100多万条的表,用sql分页,没问题的
然后再把这个返回的1000条用记录集的分页去分
但是这样的话 怎样在点下一页 末页的时候进行处理呢?PS:以每页显示20条记录为例
问题一:当我点下一页的时候,page已经为50了 那摸这个时候就要调用数据库分页,再次查询1000条记录到记录集中进行分页。然后总页数这些应该怎摸处理。
问题二:同理,当我点上一页从第51页返回到第50页的时候怎摸处理?
问题三:点末页和首页的时候到底显示的是总记录的最开始的20和最后20条还是当前筛选出来的1000条中的开始的20条和末尾的20条。
但是一旦总数据量大了的话,也有效率问题。
呵呵,听了你的问题,我决的只能靠代码控制了。
首先数据库分页封装到记录集中,前台再对记录集分页显示,但是此时有一个问题,其实也是看你的需求了,我要是改变每页的显示条数的话,假如原来是每页10条,我显示100页就OK了,可是我改成每页30条,那再从这1000条记录集中分页的话,想想可就复杂了啊,需要做几个判断……
我觉得,这样的设计对自己或用户都不是太好的设计。
这样子,楼主又考虑到分页效率的问题,那我觉得,是不是可以借助一些分页控件,可能他们内部的控制,会比我们代码控制要好一些吧!
推荐一个:pager-taglib,不依赖任何框架,jdbc就可实现。
如有其它好的实现方式还望多多交流……
public String getCountSql(String strwhere){
String sqlstr ="select count(*) from table";
if(!"".equals(strwhere) && strwhere != null){
sqlstr =sqlstr+" where "+strwhere;
}
return sqlstr;
}
// 记录sql:currpage当前页;rowsPerPage每页显示多少行
public String getListSql(int currpage,String strwhere,int rowsPerPage){
String sqlstr="select Top "+rowsPerPage+" id,name" ;
sqlstr = sqlstr + " from table";
sqlstr = sqlstr + " where (id not in(select top " + rowsPerPage * (currpage - 1);
if("".equals(strwhere)){
sqlstr = sqlstr + " id from TBdaby order by id desc)) ";
}
else{
sqlstr = sqlstr + " id from TBdaby where " +strwhere+ " order by id desc)) And "+strwhere;
}
sqlstr = sqlstr + " order by id desc ";
return sqlstr;
}
改成StringBuffer连接字符串。
在9000+ 条数据中 人工找需要的数据.... 晕死...
如果需要对9000+的数据做分页,
建议楼主研究研究 baidu 和 google 的搜索结果展示.. 当搜索结果到上万条的时候是如何处理的.. 一看就明白..
比如像这样:
List newList = rvolist.subList(((result.getPageNum()-1)*this.pagesize+1)-1, maxValue);
那我在查询的完成之后还要包装进一个list
那样效率高吗?我承认自己水平不牛,所以我才在碰到问题的时候来提问,如果你那个100W数据翻到任意页就7,8秒,那我觉得挺好了,我很满足,不过能否提供代码例子呢?我来提问是来请教问题,并没有显摆什么。愿意交流探讨,或者帮助的欢迎!!谢谢
例如一页100条,传一个“页数”参数过去;
select xxxxxx limit (页数-1)*100,100;查出来显示就是了复杂点的,就是底下那个 第 2,3,4,5,6,7 页 这个东西算法要想一下;因为第18页 就是 15,16,17,18,19,20,21偷懒的话就用下拉框把全部页码显示出来;
Session session=getSession();
Query q=session.createQuery(sql);
q.setCacheable(true);
q.setFirstResult(page*pagecount);
q.setMaxResults(pagecount);
List list=q.list();
session.clear();
session.close();
return list;
分页方式可以参考:http://news.sohu.com/1/0903/61/subject212846158.shtml
这种算法还是比较方便的
首先,那个思路也是搜索论坛在之前的一个帖子里看的 先数据库分页再记录集分页然后感觉还是支持数据库分页的多点,不过我也说了自己的那个替代想法很同意 bao110908 说的
用户不大可能去一条条的看一直从第一条到第1000条所以我的替代想法中不是说了 分页我只提供最新的几百条
其他再提供一个精度比较高点的查询,这样能够有效的缩小数据范围
不过,具体怎摸做还要看客户的意思
不是我可以决定的很感谢大家的支持,这摸多人参与讨论希望能有新的思路啊! 毕竟这个东西用的地方还是蛮多的最好提供思路的同时能给出例子程序,方便我们学习,提高自己
在数据库做分页还是比较好的,需要多少查询多少.hibernate针对一部分数据库的分页采用的是临时表(比如DB2);
如果担心数据量大了,数据库分页的效率问题,这个是任何大数据量应用都会遇到的问题,那就要调整架构\索引\数据库散列\分布式存储等架构问题了.目前还是建议楼主使用数据库分页.如果mysql的话,可以使用select top 的方式;如果是DB2的话,考虑一下临时表.
建设现在总共有 10 条数据每个页面最多显示 3页数据
每页最多显示2条数据..保存在数据库中的数据一共 10 条
一次从数据库中读取3页数据 = 3 X 2 = 6 条
每页显示2条: 对6条数据进行分页, 每次显示有3页...
之前给楼主说的看google对搜索结果的处理,, 貌似楼主压根就没看..... 1.在分页的时候首先需要知道数据库中总共有多少条记录, 例如例子中 总共有 10 条
2.需要知道每个页面显示多少条数据, 例如例子中 总共有 2 条
3.一次给用户展示多少页: 例如例子中 总共有 3 页那么这个流程就很清晰了....晕死, 下班了. 楼主先自己想着... 要是还想不明白 回头再议..
select productname,proid,ADDTIME,prodetail from (select productname,proid,ADDTIME,prodetail,rownum rn from sys.tblproduct where rownum<="+(intPage*intPageSize)+" order by proid desc) t where rn>="+ ((intPage-1)*intPageSize+1) +" order by t.proid desc ";
谷歌的搜索这种看过
但是具体的实现不是很清楚
只是用page-taglib模拟过
能否详细解释下这种分页的处理方式,或者给部分例子代码学习PS:认为此问题垃圾的可以自己离开,我提问只是因为自己不懂,想请人帮助
骂人的自己认为自己有多行?
谁不是从碰到问题到解决问题的过程得到提升的?很感谢参与讨论并提出自己意见的朋友
所以limit rum等mysql和Oracal内部的这些应该不能用吧