DynamoDB 中的 PaginatedQueryList 和 QueryResultPage 有什么区别?

H A*_*ala 6 java amazon-dynamodb dynamodb-queries

我目前正在使用 Java 和 DynamoDB 来工作DynamoDBMapper。我看到当我们使用时DynamoDBQueryExpression我们可以使用PaginatedQueryListor QueryResultPage。如果我们使用其中任何一个,下面是我们必须使用的方法,

query method - returns a [PaginatedQueryList][1]
queryPage method - returns a [QueryResultPage][1]
Run Code Online (Sandbox Code Playgroud)

PaginatedQueryList说它会首先加载 1MB 的数据,如果我们迭代,那么它会在需要时加载下一页,而且这是分页的。但是关于QueryResultPage?它说正在加载 1MB 的数据。但如果我们迭代它呢?它会加载第二页还是只给我们 1MB 的数据?我找不到任何相关信息?并且QueryResultPage还给了我们LastEvaluatedKeyPaginatedQueryList不是。那么有没有一种方法可以进入,LastEvaluatedKey否则PaginatedQueryList如果我们需要获取该密钥,我们是否必须始终使用QueryResultPage

并且也代替以下代码,

PaginatedQueryList<Data> data = dynamoDBMapper.query(Data.class, queryExpression);
Run Code Online (Sandbox Code Playgroud)

如果我们使用以下内容,

List<Data> data = dynamoDBMapper.query(Data.class, queryExpression);
data.size();
Run Code Online (Sandbox Code Playgroud)

它会加载数据库中找到的所有数据吗?如果我使用stream()而不是data.size()它会加载全部怎么办?

pet*_*ter 7

长话短说:

  • QueryResultPage不会延迟加载任何附加数据,只PaginatedQueryList会这样做。
  • PaginatedQueryList为您抽象出分页,这就是它不公开密钥的原因。如果您需要密钥,则需要使用queryPagewith QueryResultPage。如果您需要的不仅仅是第一页,您必须自己请求其他页面。
  • .size()会将所有数据加载到内存中,因为您需要数据来对它们进行计数。
  • .stream()可能会将所有数据加载到内存中,具体取决于您对流所做的操作。如果您.stream().limit(1)这样说,则不会加载更多页面。但如果你说.stream().count()那么所有页面都会被加载。

查看这两个的文档,PaginatedQueryList似乎是一个对象,它试图从你身上抽象出一个事实,即结果下面是分页的。

来自https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/PaginatedQueryList.html(重点是我的):

[...]当用户执行需要分页结果的操作时,将按需加载分页结果。某些操作(例如 size())必须获取整个列表,但在可能的情况下会逐页延迟获取结果。

所以,如果你基本上不想处理分页,就使用该query方法。但请记住,如果您想返回所有结果(或知道它们的大小),您的应用程序最终仍然需要对结果进行分页

另一方面,QueryResultPage更接近DynamoDB API。您正在处理一个页面,您可以使用getLastEvaluatedKey()来获取用于下一个页面的参数setExclusiveStartKey(在您的DynamoDBQueryExpression

总之:

  • query对用户更加友好,因为它隐藏了显式分页,但如果您的结果包含许多页面,您的代码可能会变慢而您一开始没有注意到,因为这些页面是延迟加载的。
  • queryPage意图更加明确。例如,您必须手动加载每个页面,因此请考虑您是否真的需要所有数据,或者您是否不想进一步将分页卸载到客户端。

您可以在阅读https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.queryPage的官方文档时阅读类似的描述queryPage(重点是我的):

查询表或二级索引并返回单页匹配结果。与查询方法一样,您必须指定分区键值和应用于排序键属性的查询过滤器。但是,queryPage 仅返回数据的第一“页”,即 1 MB 的数据量