我从性能的角度寻找最好的方法,部分地在网页上显示Resultset,让我们说每页10项,如果用户想看到更多的结果,他按“下一步”btn。 我认为(可能是错误的)当按下“下一步”按钮时,它应该是对服务器的新请求??
currentlly我试图学习Java,GWT
谢谢你!PS:对不起我的英语。
答案 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不允许您在一次交易中检索。
答案 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