有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

gwt分页大结果集Java的最佳方式是什么

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

目前我正在努力学习Java,GWT

谢谢大家!

PS:对不起我的英语


共 (6) 个答案

  1. # 1 楼答案

    因为您的标签中有“GWT”,所以我假设您的服务器应用程序正在Google app Engine(GAE)上运行

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

    • 另一种方法是获取每个页面视图上的所有结果,但跳过结果,直到找到所需的20个子集,然后只输出这些结果

    我认为在下面使用GAE时,第二种方法会更好,除非您的查询可能返回1000多个结果,而GAE不会让您在一个事务中检索这些结果

    • 如果您的数据和键适合它,那么最好的方法是在查询时提取已经正确的20个数据项。但是,除非您的数据具有连续递增的整数键,否则这可能很难做到
  2. # 2 楼答案

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

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

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

    select col, col2 from my_table where
    row_id > 100
    and row_id <= 200
    order by rownum asc
    
  3. # 3 楼答案

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

    最流行的方法是使用会话在web层缓存它们

  4. # 5 楼答案

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

    让我们说一个问题

    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进行分页。这样做的另一个好处是排序可以在客户端完成

  5. # 6 楼答案

    答案将取决于用户的行为:用户多久看一次第2页、第10页或第100页

    如果他们很少看第2页,从不看第10页或第100页,那么重新提交请求就可以了

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

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