如果基础数据可以改变,如何管理来自超媒体驱动的RESTful API的分页结果?

时间:2016-02-17 11:57:53

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

  • 如果您不想将实际数据保留在内存中,则会遇到很多麻烦。您可以存储结果集的处理程序,而不是结果本身,并循环遍历它,获取您实际需要的行数。例如。运行select,获取10行并存储结果集的处理程序。与行一起,您将向查询客户端返回查询的唯一ID。问题是当你指定了一个范围时,因为你无法真正“倒回”数据库光标,这意味着缓存结果,你可能还想做。但是如果你这样做的话,迟早你会把所有的结果留在记忆中。

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

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