分页大Resultset -Java的最佳方法是什么

时间:2010-01-03 13:30:08

标签: java gwt jdbc pagination

我从性能的角度寻找最好的方法,部分地在网页上显示Resultset,让我们说每页10项,如果用户想看到更多的结果,他按“下一步”btn。  我认为(可能是错误的)当按下“下一步”按钮时,它应该是对服务器的新请求??

currentlly我试图学习Java,GWT

谢谢你!

PS:对不起我的英语。

6 个答案:

答案 0 :(得分:3)

答案取决于用户的行为:查看第2页,第10页或第100页的频率。

如果他们很少查看第2页,从不查看第10页或第100页,那么重新提交请求可能没问题。

如果他们通常查看第2页,经常查看第10页,偶尔查看第100页,那么部分缓存将非常有用:缓存前100(或200或300)个结果,并仅重新提交查询当他们超过这些结果时。我可能会将缓存存储在用户的会话中,但是如果你的应用服务器是集群的,你必须考虑一下。

如果他们总是翻阅每个结果?部分缓存仍然是答案,因为您不希望在内存中存储大块数据。

答案 1 :(得分:1)

由于您的代码中包含“GWT”,因此我假设您的服务器应用程序正在Google App Engine(GAE)上运行。

  • 一种方法是让您的第一个查询获取所有结果,将它们存储在数据库中,显示前20个,然后让下一个/ prev链接将存储数据的子集拉出数据库。当用户的会话超时时,您必须记住从数据库中删除这些结果!

  • 另一种方法是在每个页面视图上获取所有结果,但跳过结果直到您达到所需的20的子集,并仅输出那些。

我认为对于GAE,第二种方法会更好,除非您的查询可能会返回超过1000条结果,GAE不允许您在一次交易中检索。

  • 如果您的数据和密钥适合它,最好的方法是在查询时提取正确的20个数据项。但除非你的数据有连续升序的整数键,否则这可能很难。

答案 2 :(得分:0)

您通常只会从数据库中获取“页面”。

让我们说一个查询

select * from mytable where column1="a";

将提供1000条记录。然后获取页面就像(mysql):

select * from mytable where column1="a" limit 0, 10;

表示第1页(0到10),第2页将被检索为:

select * from mytable where column1="a" limit 10, 20;

等等。如果数据很大(1000条记录),但不是很大(1000 000条记录),您也可以立即提供整个数据集并使用javascript页面。这样做的另一个好处是可以在客户端进行排序。

答案 3 :(得分:0)

如果由于内存限制而无法使用基于缓存的方法,请使用基于查询的方法。调整搜索查询中的WHERE子句,以根据用户请求的页面显式选择数据。此方法要求您在页面请求上来回传递其他上下文信息。

一种方法是使用逻辑行ID(或主键)获取页面,这些行分隔页面并标识结果集中的每一行。

假设您有一个非常简单的表,其中包含行ID的数字序列。如果每页显示100行,并且用户已请求第2页,则应按如下方式调整WHERE子句:

select col, col2 from my_table where
row_id > 100
and row_id <= 200
order by rownum asc

答案 4 :(得分:0)

您可以缓存/检索Web层,后端层(例如ejb)或数据库层(作为最后一个“limit”或row_id语句)中的记录。你应该使用哪种方法取决于你的要求(如kdgregory所说)。

最常用的是使用会话将它们缓存在网络层。

答案 5 :(得分:0)

如果您正在使用JPA(在GAE上运行良好),您可以使用

对结果集进行分页

Query#setFirstResult(int startPosition)

Query#setMaxResults(int maxResult)

这篇文章可能会有帮助:Paging large data sets with a LazyList