3

我遇到了 DynamoDB 扫描问题。我使用putItem方法向表中添加了新项目。

[[AmazonClientManager ddb] putItem:request];

但是,当我尝试使用 scan 方法使用 scan 获取时,该项目不会出现在结果中。

DynamoDBScanResponse *response = [[AmazonClientManager ddb] scan:request];

我收到以下回复,

{Items: ( ),Count: 0,ScannedCount: 608,LastEvaluatedKey: {HashKeyElement: {S: U2575220130319062347000,N: (null),SS: ( ),NS: ( ),},RangeKeyElement: (null),}, ConsumedCapacityUnits:129,{requestId:3GVT8PJGV4VB45IUPUA6KIN9URVV4KQNSO5AEMVJF66Q9ASUAAJG}}

但是当我使用 AWS 控制台检查时,这些项目显示在表格中。谁能让我知道可能是什么问题?

谢谢。

4

3 回答 3

9

Scan API 最终是一致的。最终一致读取可能不会返回最近的更改。有一点延迟(不超过几秒钟)。

查询 API 允许一致的选项。如果您愿意,您可以使用 Query。

另一种可能性是您可能尚未完成对扫描结果的处理——需要重复扫描,直到 LastEvaluatedKey 为空。

http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html

于 2013-05-28T16:39:20.260 回答
1

将 ConsistentRead 设置为 true 对我有用:

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html#DDB-Scan-request-ConsistentRead

确定扫描期间读取一致性模型的布尔值:

如果 ConsistentRead 为 false,则从 Scan 返回的数据可能不包含其他最近完成的写入操作(PutItem、UpdateItem 或 DeleteItem)的结果。

如果 ConsistentRead 为真,则保证在 Scan 开始之前完成的所有写操作都包含在 Scan 响应中。

ConsistentRead 的默认设置为 false。

于 2018-09-25T09:06:33.437 回答
0

如果有人对一致的读取有问题,这意味着您期待他们,但它似乎并不总是有效,这是我的发现/解决方案......

  1. 假设您使用的是 AWS Java SDK - com.amazonaws:aws-java-sdk-dynamodb
  2. 首先,我们进行了一个高速循环的单元测试,以便能够重新创建读取不一致。
  3. 测试将读取特定行,更新它,然后读回同一行以断言更新的值。


鉴于有 3 种获取数据的方法:

  • 映射器.load()
  • mapper.query()
  • 映射器.scan()


“mapper.load()”使用映射器实例化时设置的映射器配置。例如 - mapper.withConsistentReads(ConsistentReads.CONSISTENT)。

“mapper.query()”和“mapper.scan()”不尊重映射器的配置,而是只使用 DynamoDBQueryExpression 和 DynamoDBScanExpression 输入来确定一致的读取。


解答:您需要使用 expression.setConsistentRead(true),即使您的映射器有 .withConsistentReads(ConsistentReads.CONSISTENT)。像这样...

public PaginatedScanList<T> getAllRowsFor() {
    final DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
    scanExpression.setConsistentRead(true);
    return mapper.scan(myClass, scanExpression);
}

您可以在此处查看显示未使用映射器配置的 AWS Java 源代码 - com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper#createScanRequestFromExpression

于 2019-06-18T20:08:19.227 回答