全部博文(20)
分类: 系统运维
2009-07-16 10:14:42
//查询所有记录 rs = statement.executeQuery("SELECT * FROM books order by title, bookid"); |
//intLower是此页应该显示的第一条记录,intUpper是每页应该显示的最后一条记录 <%for (i = intLower; i <= intUpper; i++){%> | |||
<%=rs.getString(1)%> | <%=rs.getString(2)%> | <%=rs.getString(3)%> | <%=rs.getString(4)%> |
//制作分页标签 <%if(intLower > intPageSize){%>Previous<%}%> |
//如果用户是点了 Previous 进入这一页的:strFirstTitle 和 intFirstBookid 是父页的第一条记录的标志,用它来做条件查询,只SELECT 这条记录之前的所有记录,再从这些 SELECT 出的记录中截取此页应该显示的记录。 rs = statement.executeQuery("SELECT * FROM books WHERE (title = '" + strFirstTitle + "'AND bookid <" + intFirstBookid + " ) OR (title <'" + strFirstTitle + "') ORDER BY title, bookid"); |
//如果用户是点了 Next 进入这一页的: strLastTitle 和 intLastBookid 是父页最后一条记录的标志,用它来做条件查询,只SELECT这条记录之后的所有记录,再从这些 SELECT 出的记录中截取此页应该显示的记录。 rs = statement.executeQuery("SELECT * FROM books WHERE (title = '" + strLastTitle + "'AND bookid >" + intLastBookid + " ) OR (title >'" + strLastTitle + "') ORDER BY title, bookid"); |
//用DO...WHILE循环把截取的记录显示一下。 <%do { | |||
<%=rs.getString(1)%> | <%=rs.getString(2)%> | <%=rs.getString(3)%> | <%=rs.getString(4)%> |
//在此页的下部,做成 Next 和 Previous 按钮,并把改传的标志数据传给子页。 <% |
分析:这种方法一定程度上解决了“如果结果集太大,内存可能不够”的问题。但却不是“想显示多少,就 SELECT 多少”的。而且显示每一页的时候都要重复建立 connection ,花费大量时间,在这方面,跟第一种方法的缺点一样。
3. 比较好的:对于每一页,想显示多少,就 SELECT 多少。运用排序和 LIMIT 选择 topn 的记录。
//如果用户是点了 Previous 进入这一页的:还是用父页的第一条记录做标志,向前 SELECT 每页想显示的记录数,然后再把它们反序。 rs = statement.executeQuery("SELECT * FROM (SELECT * FROM books WHERE (title = '" + strFirstTitle + "'AND bookid <" + intFirstBookid + " ) OR (title <'" + strFirstTitle + "') ORDER BY title desc, bookid desc LIMIT " + 0 + " ," + intPageSize + " ) AS temptable ORDER BY title asc, bookid asc"); |
//如果用户是点了 Next 进入这一页的:还是用父页的最后一条记录做标志,向后 SELECT 每页向现实的记录数。 rs = statement.executeQuery("SELECT * FROM books WHERE (title = '" + strLastTitle + "'AND bookid >" + intLastBookid + " ) OR (title >'" + strLastTitle + "') ORDER BY title, bookid LIMIT " + 0 + " ," + (intPageSize + 1)); |
//做个DO...WHILE循环,把此页的记录显示在Web Page上。 <%do { | |||
<%=rs.getString(1)%> | <%=rs.getString(2)%> | <%=rs.getString(3)%> | <%=rs.getString(4)%> |
//在此页下方显示 Next 和 Previous 按钮,并把需要的数据传给子页。 <% |
分析: 这种方法实现了“想显示多少条,就 SELECT 多少条”的目的。但是对于每页,仍然是重复建立 connection。对于 Web 应用我实在是个门外汉,如果是纯 JSP 解决方案,我只能做到这个程度了。sigh~
关于这个问题的讨论,以下文章写得很好很详细,全面讨论了 cache-based 和 query-based 的解决方案:
Paging in J2EE: Manage Large Result Sets Efficiently
写得实在太好,本来想翻译一下的,可是正是因为作者写得太好,所以不敢贸然翻译,生怕贻笑大方。只得贴在这里让大家欣赏下原文了。
关于这个问题的 research,是轮讲的时候做的,所以自己弄了ppt,传上来给大家看看,以弥补语言表达上的不足。
|