java - 如果底层数据可能发生变化,如何管理超媒体驱动的 RESTful API 的分页结果?

标签 java web-services rest hateoas spring-hateoas

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

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

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

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

最佳答案

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

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

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

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

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

关于java - 如果底层数据可能发生变化,如何管理超媒体驱动的 RESTful API 的分页结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35456087/

相关文章:

c# - SOAP 扩展实现

java - 如何在 RestAssured 中分离业务逻辑

在spark中执行sbt包时出现Java内存问题

java - java中数据发送缓冲区的一般实现是什么?

php - 使用 PHP 在 WSDL 中使用奇怪的附加响应

javascript - 如何在 Backbone 中获取单个模型?

java - 我可以使用 Spring Security @PreAuthorize 来检查 HTTP header 吗?

java - 如何在Android上使用Retrofit解析json数据

java keystore 和密码设置

Java-webservice : Glassfish3. 0 错误 "org.codehaus.jackson.jaxrs.JacksonJsonProvider"