我正在尝试将大量记录写入dynamoDB,我想知道这样做的正确方法是什么。目前,我正在使用 DynamoDBMapper 在一个批处理写入操作中完成工作,但在阅读文档后,我不确定这是否是正确的方法(特别是如果对写入项目的大小和数量有一些限制)。
假设我有一个包含 10000 条记录的 ArrayList,我像这样保存它:
mapper.batchWrite(recordsToSave, new ArrayList<BillingRecord>());
第一个参数是包含要写入的记录的列表,第二个参数包含要删除的项目(在这种情况下没有此类项目)。
映射器是将此写入拆分为多个写入并处理限制,还是应该显式处理?
我只找到了直接使用 AmazonDynamoDB 客户端完成批处理写入的示例(例如这个)。直接使用客户端进行批处理操作是正确的方法吗?如果是这样,拥有映射器有什么意义?
映射器是否将对象列表拆分为多个批次,然后分别写入每个批次?是的,它会为您进行批处理,您可以看到它将要写入的项目拆分为最多 25 个项目的批次。然后,它会尝试写入每个批处理,每个批处理中的某些项目可能会失败。映射器文档中给出了一个失败的示例:
如果批处理中单个对象的大小超过 400 KB,则此方法无法保存批处理。有关批处理限制的详细信息,请参阅 http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html
该示例讨论的是一条记录的大小(在您的案例中是一个计费记录实例)超过 400KB,在撰写此答案时,这是 DynamoDB 中记录的最大大小。
如果特定批处理失败,它将移动到下一个批处理(如果失败是由于限制而使线程休眠一会儿)。最后,所有失败的批处理都将在 FailedBatch 实例列表中返回。每个 FailedBatch 实例都包含未写入 DynamoDB 的未处理项目的列表。
您提供的代码段是否是执行批量写入的正确方法?我能想到两个建议。如果没有要删除的项目,则 BatchSave 方法更合适。您可能还需要考虑要对失败的批处理执行的操作。
直接使用客户端是正确的方法吗?如果是这样,映射器的意义何在?映射器只是客户端周围的包装器。映射器为您提供了一个 ORM 层,用于将您的 BillingRecord 实例转换为低级客户端使用的嵌套哈希映射。直接使用客户端没有错,这确实发生在一些特殊情况下,需要额外的功能需要在映射器之外进行编码。