【问题标题】:How can paginated results from a hypermedia driven RESTful API be managed if the underlying data can change?如果底层数据可以更改,如何管理来自超媒体驱动的 RESTful API 的分页结果?
【发布时间】:2016-02-17 20:37:57
【问题描述】:

我正在创建一个超媒体驱动的 RESTful API,用于查询事务数据。目的是对结果进行分页。

每个 API 调用都会查询一个索引数据库表。由于出于内存考虑,我不想保留结果服务器端,因此我正在考虑根据请求的页面检索基于 rownum 的数据。例如。在第一页,WHERE rownum <= 10,在第二页,WHERE rownum BETWEEN 11 AND 20 等等。

但是,有问题的数据库是从生产系统复制的,可能会将记录添加到已请求的结果集区域中。例如。请求第一页 -> 返回 10 行 -> 在第 5 行插入事务。现在第二页将包含已在第一页显示的记录,因为结果实际上是由 rownum 向上推的。

什么是实现我的目标的好方法,即创建一个超媒体驱动的 RESTful API,从数据库提供分页事务数据,而不在会话期间保留结果集?

【问题讨论】:

    标签: java web-services rest hateoas spring-hateoas


    【解决方案1】:

    这是一个很常见的问题,实际上没有很多方法。 实际上,我只能想到三个:

    • 你不在乎,结果会改变。这是 stackoverflow 的行为:如果您在问题页面的第 2 页上并且有人发布了一个新问题,则在单击第 3 页时,您可能会得到一个或多个已在第 2 页上列出的问题,因为索引已经改变了。

    • 如果您不想将实际数据保存在内存中,那么您会遇到很多麻烦。您可以存储结果集的处理程序,而不是结果本身,并遍历它以获取您实际需要的行数。例如。您运行选择,获取 10 行并存储结果集的处理程序。连同这些行,您向客户端返回查询的唯一 ID。问题将出现在您指定范围时,因为您不能真正“倒回”数据库游标,这意味着缓存结果,您可能无论如何都想做。但如果你这样做,迟早你会把所有结果都保存在内存中。

    • 您仍然可以使用一些内存,但只保留与查询的唯一标识符相关联的行的一些唯一标识符,如上所述。这可以工作,但前提是可以添加行,而不是删除或更新行(如果它们被更新,它们可能不再与查询匹配)。

    就个人而言,我会选择选项 1。

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      相关资源
      最近更新 更多