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

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

currentlly我试图学习Java,GWT

谢谢!

PS:抱歉我的英语。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我们来说一个查询

 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进行分页。 这具有额外的优点,即可以在客户端进行排序。

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

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

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

Query#setFirstResult(int startPosition)

查询#setMaxResults(int maxResult)

本文可能会有所帮助: 使用LazyList对大型数据集进行分页