Batch 操作使用Amazon SDK for .NET对象持久化模型 - Amazon DynamoDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Batch 操作使用Amazon SDK for .NET对象持久化模型

Batch 写入:放置和删除多个项目

要在单个请求中放置或删除表中的多个对象,请执行以下操作:

  • 运行CreateBatchWrite方法DynamoDBContext,并创建BatchWrite类。

  • 指定要放入或删除的项目。

    • 要放置一个或多个项目,请使用AddPutItemAddPutItems方法。

    • 要删除一个或多个项目,可以指定项目的主键或映射到要删除的项目的客户端对象。使用AddDeleteItemAddDeleteItems,以及AddDeleteKey方法来指定要删除的项目列表。

  • 调用BatchWrite.Execute方法从表中放置和删除所有指定项目。

注意

使用对象持久化模型时,您可以批量指定任意数量的操作。但是,请注意,Amazon DynamoDB 限制了批量操作的数量以及批量操作中批的总大小。有关具体限制的更多信息,请参阅。BatchWriteItem。如果 API 检测到您的批量写入请求超出容许的写入请求数量,或者超出了容许的最大 HTTP 负载大小,它就会将批划分为多个较小的批。此外,如果批量写入的响应返回了未处理的项目,API 将会就这些未处理的项目自动发送另一个批请求。

假设您定义了一个 C# 类Book类,该类映射到ProductCatalogDynamoDB。下面的 C# 代码示例使用BatchWrite对象,以上传两个项目并从ProductCatalog表。

DynamoDBContext context = new DynamoDBContext(client); var bookBatch = context.CreateBatchWrite<Book>(); // 1. Specify two books to add. Book book1 = new Book { Id = 902, ISBN = "902-11-11-1111", ProductCategory = "Book", Title = "My book3 in batch write" }; Book book2 = new Book { Id = 903, ISBN = "903-11-11-1111", ProductCategory = "Book", Title = "My book4 in batch write" }; bookBatch.AddPutItems(new List<Book> { book1, book2 }); // 2. Specify one book to delete. bookBatch.AddDeleteKey(111); bookBatch.Execute();

要从多个表中放置或删除对象,请执行以下操作:

  • 创建一个BatchWrite类,并指定要放置或删除的项目(如上一部分所述)。

  • 创建的实例MultiTableBatchWrite使用以下方法之一:

    • 运行Combine方法中的一个BatchWrite对象,以及您在之前步骤中创建的对象。

    • 创建的实例MultiTableBatchWrite类型,方法是提供BatchWrite对象。

    • 运行CreateMultiTableBatchWrite方法DynamoDBContext并传入您的BatchWrite对象。

  • 调用Execute方法MultiTableBatchWrite,它对各种表执行指定的放置和删除操作。

假设您定义了ForumThreadC# 类映射到ForumThreadDynamoDB。另外,假设Thread类已启用版本控制。由于使用批量操作时不支持版本控制,您必须明确禁用版本控制(如下面的 C# 代码示例所示)。本示例使用MultiTableBatchWrite对象执行多表更新。

DynamoDBContext context = new DynamoDBContext(client); // Create BatchWrite objects for each of the Forum and Thread classes. var forumBatch = context.CreateBatchWrite<Forum>(); DynamoDBOperationConfig config = new DynamoDBOperationConfig(); config.SkipVersionCheck = true; var threadBatch = context.CreateBatchWrite<Thread>(config); // 1. New Forum item. Forum newForum = new Forum { Name = "Test BatchWrite Forum", Threads = 0 }; forumBatch.AddPutItem(newForum); // 2. Specify a forum to delete by specifying its primary key. forumBatch.AddDeleteKey("Some forum"); // 3. New Thread item. Thread newThread = new Thread { ForumName = "Amazon S3 forum", Subject = "My sample question", KeywordTags = new List<string> { "Amazon S3", "Bucket" }, Message = "Message text" }; threadBatch.AddPutItem(newThread); // Now run multi-table batch write. var superBatch = new MultiTableBatchWrite(forumBatch, threadBatch); superBatch.Execute();

要了解可工作的示例,请参阅示例:Batch 写入操作Amazon SDK for .NET对象持久化模型

注意

DynamoDB 批量 API 限制了批量操作的数量,还限制了批的大小。有关更多信息,请参阅 。BatchWriteItem。使用 .NET 对象持久化模型 API 时,您可以指定任意数量的操作。但是,如果批处理中的操作数或大小超过限制,.NET API 将批处理写入请求分成较小的批处理,并将多个批处理写入请求发送到 DynamoDB。

Batch 获取:获取多个项目

要在单个请求中从表中检索多个项目,请执行以下操作:

  • 创建 CreateBatchGet 类的实例。

  • 指定要检索的主键列表。

  • 调用 Execute 方法。该响应返回Results属性。

以下 C# 代码示例从ProductCatalog表。结果中的项目不一定按指定主键的顺序相同。

DynamoDBContext context = new DynamoDBContext(client); var bookBatch = context.CreateBatchGet<ProductCatalog>(); bookBatch.AddKey(101); bookBatch.AddKey(102); bookBatch.AddKey(103); bookBatch.Execute(); // Process result. Console.WriteLine(bookBatch.Results.Count); Book book1 = bookBatch.Results[0]; Book book2 = bookBatch.Results[1]; Book book3 = bookBatch.Results[2];

要从多个表检索对象,请执行以下操作:

  • 对于每种类型,创建CreateBatchGet类型,并提供要从每个表中检索的主键值。

  • 创建的实例MultiTableBatchGet类使用以下方法之一:

    • 运行Combine方法中的一个BatchGet对象。

    • 创建的实例MultiBatchGet类型,方法是提供BatchGet对象。

    • 运行CreateMultiTableBatchGet方法DynamoDBContext并传入您的BatchGet对象。

  • 调用Execute方法MultiTableBatchGet,它返回单个BatchGet对象。

以下 C# 代码示例从OrderOrderDetail表使用CreateBatchGet方法。

var orderBatch = context.CreateBatchGet<Order>(); orderBatch.AddKey(101); orderBatch.AddKey(102); var orderDetailBatch = context.CreateBatchGet<OrderDetail>(); orderDetailBatch.AddKey(101, "P1"); orderDetailBatch.AddKey(101, "P2"); orderDetailBatch.AddKey(102, "P3"); orderDetailBatch.AddKey(102, "P1"); var orderAndDetailSuperBatch = orderBatch.Combine(orderDetailBatch); orderAndDetailSuperBatch.Execute(); Console.WriteLine(orderBatch.Results.Count); Console.WriteLine(orderDetailBatch.Results.Count); Order order1 = orderBatch.Results[0]; Order order2 = orderDetailBatch.Results[1]; OrderDetail orderDetail1 = orderDetailBatch.Results[0];