主题:jsp页面分页显示问题
Oo光光oO
[专家分:160] 发布于 2007-01-28 13:32:00
jsp页面如何实现分页显示啊?
回复列表 (共3个回复)
沙发
yexin218 [专家分:4070] 发布于 2007-01-28 16:22:00
title: JSP分页技术实现
summary:使用工具类实现通用分页处理
author: evan_zhao
email: evan_zhao@hotmail.com
from:http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=8893
目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间,并且缓存的数据也会占用大量内存,效率明显下降。
其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中差不多也是需要遍历所有记录,实验证明在记录数很大时速度非常慢。
至于缓存结果集ResultSet的方法则完全是一种错误的做法。因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。
因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。
在oracle数据库中查询结果的行号使用伪列ROWNUM表示(从1开始)。例如select * from employee where rownum<10 返回前10条记录。但因为rownum是在查询之后排序之前赋值的,所以查询 employee按birthday排序的第100到120条记录应该这么写:
select * from (
select my_table.*, rownum as my_rownum from (
select name, birthday from employee order by birthday
) my_table where rownum <120
) where my_rownum>=100
mySQL可以使用LIMIT子句:
select name, birthday from employee order by birthday LIMIT 99,20
DB2有rownumber()函数用于获取当前行数。
SQL Server没研究过,可以参考这篇文章:http://www.csdn.net/develop/article/18/18627.shtm
请参考:
http://www.blogjava.net/lostfire/articles/35135.html
http://dev.csdn.net/develop/article/75/75613.shtm
http://www.5inet.net/WebPrograming/JSP/068534,MuJianCuoHaoDeJSPBanXieJiShu.aspx
板凳
leaonow [专家分:960] 发布于 2007-01-28 18:43:00
另外要视你的用户群的使用习惯,和网站的规模
使用习惯:
1,读多写多?
如果读多写少,可以采取一次性的办法~
2是否注重时效性
如果注重时效性,不建议一次取出,会有过期数据~
规模:
1大小?
如果很大,我说得是数据阿~可以每次只从数据库调一(或几)页的数量,如果数据规模很小,倒不如采取一次取出的做法
恩.其实还有很多考虑的因素,自己衡量一下
3 楼
Oo光光oO [专家分:160] 发布于 2007-01-28 20:01:00
十分感谢楼上两位,不过
SQL Server参考这篇文章:http://www.csdn.net/develop/article/18/18627.shtm
链界好象没用啊.
我来回复