如何在DynamoDB的UpdateItemSpec中使用ReturnValuesOnConditionCheckFailure?
我们目前使用DynamoDB的“中等层级”Java客户端,通过UpdateItemSpec类传递参数,示例代码如下:
@Override public void announce(long stateVersion) { Table table = dynamoDB.getTable(tableName); UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("namespace", blobNamespace) .withUpdateExpression("set #version = :ver").withNameMap(new NameMap().with("#version", "version")) .withValueMap(new ValueMap().withNumber(":ver", stateVersion)); table.updateItem(updateItemSpec); }
DynamoDB近期新增了一项功能:在UpdateItem请求中传入ReturnValuesOnConditionCheckFailure参数,可以在条件检查失败时返回旧项目数据。
我想知道如何在UpdateItemSpec中使用该参数?我没找到相关文档,无法尝试。我的目标是在条件检查失败时利用该参数进行调试,想了解是否无需切换到使用UpdateItemRequest的低级客户端就能实现,以及DynamoDB是否计划更新UpdateItemSpec以支持该参数。
回答
当前版本的中等层级客户端(UpdateItemSpec)暂不支持ReturnValuesOnConditionCheckFailure参数。这个参数是DynamoDB API的新增功能,但中等层级的document客户端封装暂时没有同步更新对应的API,所以直接通过UpdateItemSpec无法设置该参数。
如果不想完全切换到低级的UpdateItemRequest客户端,可以通过以下方式处理:
方案一:复用UpdateItemSpec配置,转用低级客户端执行
可以基于已有的UpdateItemSpec配置,手动转换为UpdateItemRequest并添加目标参数,示例代码如下:
@Override public void announce(long stateVersion) { Table table = dynamoDB.getTable(tableName); // 构建原有的UpdateItemSpec配置 UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("namespace", blobNamespace) .withUpdateExpression("set #version = :ver").withNameMap(new NameMap().with("#version", "version")) .withValueMap(new ValueMap().withNumber(":ver", stateVersion)); // 转换为UpdateItemRequest并设置ReturnValuesOnConditionCheckFailure UpdateItemRequest request = updateItemSpec.toUpdateItemRequest(); request.setReturnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD); // 通过低级客户端执行请求 dynamoDB.getAmazonDynamoDB().updateItem(request); }
这种方式既保留了原有的配置逻辑,又能使用新增参数,无需大幅重构代码。
方案二:等待SDK版本更新
AWS通常会在后续的Java SDK版本中,将新的API参数同步到中等层级的客户端封装中。你可以关注SDK的版本更新日志,当UpdateItemSpec添加了类似withReturnValuesOnConditionCheckFailure的方法后,就能直接在原代码中调用该方法设置参数。
总结:目前必须借助低级客户端的UpdateItemRequest才能使用该参数,但可以通过UpdateItemSpec.toUpdateItemRequest()减少代码改动;AWS大概率会在后续版本中为UpdateItemSpec添加该参数的支持。
内容的提问来源于stack exchange,提问作者Bolong

