【发布时间】:2015-07-28 13:18:38
【问题描述】:
我有一个 DynamoDB,我用它来存储有关 EC2 实例的一些信息,所以我使用实例 ID 作为 HashKey。
每周一次,我运行一个代码,将很多记录插入到这个表中:
AmazonDynamoDB amazonDynamoDB = new AmazonDynamoDBClient();
DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDB);
// saving records
List<FailedBatch> failedBatch = mapper.batchSave(recordsToSave);
我只关心最新信息,因此如果我尝试插入的 HashKey 已存在于数据库中,我想覆盖 DynamoDB 中的旧记录。但是,每次我尝试插入这样的值时,操作都会失败(faildBatch),因为它无法处理重复。
有没有办法通过 DynamoDB 实现这种行为,还是我必须更改表设计?
【问题讨论】:
-
你有具体的错误吗?您应该能够使用批处理请求替换项目,但是使用批处理操作时,某些功能(例如条件写入)不可用。
-
BatchWriteItem 绝对能够覆盖表中的现有项目。关于重复的错误听起来就像您在一个批次中包含对同一个哈希键的多次写入。
-
这与第二个答案相矛盾...您能否在文档中提供一些证据来支持这一说法?我还没有找到。
-
“记录已存在于表中”在 BatchWriteItem 调用可能被拒绝here 的原因列表中明显缺失,但它确实表示如果“您尝试执行在同一个 BatchWriteItem 请求中对同一个项目进行多次操作。例如,您不能在同一个 BatchWriteItem 请求中放置和删除同一个项目。使用小型集成测试验证覆盖是否有效也很容易。
-
这些都是拒绝整批的理由。如果批次被接受,某些事情可能仍然失败......我想这就是我们在这种情况下看到的
标签: java amazon-web-services amazon-dynamodb