我希望您能够从性能的角度出发,提供最佳方法来部分地在网页上显示Resultset,比如每页10个项目,如果用户想要查看更多结果,则按下“下一页”按钮。
我认为(可能是错误的),当按下“下一页”按钮时,应该向服务器发送新的请求?
目前,我正在尝试学习Java,GWT。
谢谢!
PS:对于我的英语,我很抱歉。
目前,我正在尝试学习Java,GWT。
谢谢!
PS:对于我的英语,我很抱歉。
既然你的标签中有"GWT",我会认为你的服务器应用正在运行于Google App Engine(GAE)上。
一种方法是在第一次查询时获取所有结果,将它们存储在数据库中,展示前20个,然后让下一页/上一页链接从数据库中拉取子集数据。但在用户会话超时时,必须记得从数据库中删除那些结果!
另一种方法是在每个页面视图中获取所有结果,但跳过结果直到找到所需的20个子集,然后仅输出这些结果。
我认为在GAE下,第二种方法会更好,除非你的查询可能返回超过1000个结果,在一次交易中GAE不能让你检索那么多。
select * from mytable where column1="a";
这会提供1000条记录。然后获取页面类似于(mysql):
select * from mytable where column1="a" limit 0, 10;
对于第一页(0到10),第二页将会像这样被获取:
select * from mytable where column1="a" limit 10, 20;
如果由于内存限制而无法使用基于缓存的方法,请使用基于查询的方法。调整搜索查询的WHERE子句,根据用户请求的页面明确选择数据。这种方法需要在页面请求中来回传递附加的上下文信息。
一种方法是使用逻辑行ID(或主键)获取页面,以界定页面并识别结果集中的每一行。
假设您有一个非常简单的表格,其中包含一系列数字顺序的行ID。如果您每页显示100行,并且用户请求了第二页,您将如下调整WHERE子句:
select col, col2 from my_table where
row_id > 100
and row_id <= 200
order by rownum asc
您可以在Web层、后端层(例如EJB)或数据库层(作为最后的“限制”或row_id语句)中缓存/检索记录。您应该使用哪种方法取决于您的要求(如kdgregory所说)。
最流行的方法是使用会话在Web层缓存它们。