[英]DynamoDB - Newly put items are not reflecting in scan
我有DynamoDB扫描的问题。 我使用putItem方法向表中添加了新项。
[[AmazonClientManager ddb] putItem:request];
但是当我尝试使用扫描方法使用扫描获取时,该项目不会出现在结果中。
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控制台检查时,这些项目显示在表格中。 谁能让我知道可能是什么问题?
谢谢。
Scan API最终是一致的。 最终的一致性读取可能不会返回最近的更改。 有一点延迟(不超过几秒钟)。
查询API允许一致的选项。 如果这是您的选项,您可以使用查询。
另一种可能性是您可能尚未完成扫描结果的处理 - 需要重复扫描,直到LastEvaluatedKey为空。
http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html
将ConsistentRead设置为true对我有用:
一个布尔值,用于确定扫描期间的读取一致性模型:
如果ConsistentRead为false,则从Scan返回的数据可能不包含其他最近完成的写操作(PutItem,UpdateItem或DeleteItem)的结果。
如果ConsistentRead为true,则保证扫描开始之前完成的所有写入操作都包含在扫描响应中。
ConsistentRead的默认设置为false。
如果有人遇到一致读取问题,意味着你期待它们,但它似乎并不总是有效,这是我的发现/解决方案......
鉴于有3种方法可以获取数据:
“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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.