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

Rob*_*ain 2 java rest web-services hateoas spring-hateoas

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

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

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

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

Cha*_*One 5

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

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

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

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

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