开发手册 欢迎您!
软件开发者资料库

DynamoDB - 批量写作

DynamoDB批处理编写 - 从基本概念到高级概念的简单简单步骤学习DynamoDB,其中包括概述,基本概念,环境,操作工具,数据类型,创建,加载,查询,删除表,API接口,创建,获取,更新,删除项目,批量写入,批量检索,查询,扫描,索引,全局,本地二级索引,聚合,访问控制,权限API,条件,Web身份联合,数据管道,数据备份,监控,CloudTrail,MapReduce,表活动,错误处理,最佳实践。

批量书写通过创建或删除多个项目来处理多个项目.这些操作使用 BatchWriteItem ,它具有不超过16MB写入和25个请求的限制.每个项目都遵守400KB的大小限制.批量写入也无法执行项目更新.

什么是批量写入?

批量写入可以跨多个表操作项目.每个请求都会发生操作调用,这意味着操作不会相互影响,并且允许异构混合;例如,批量中有一个 PutItem 和三个 DeleteItem 请求,而PutItem请求的失败不会影响其他请求.失败的请求导致操作返回与每个失败请求有关的信息(密钥和数据).

注意 : 如果DynamoDB在不处理任何项目的情况下返回任何项目,请重试它们;但是,使用退避方法来避免基于重载的另一个请求失败.

当以下一个或多个语句被证明是真的去时,DynamoDB拒绝批量写入操作;

  • 请求超出预配的吞吐量.

  • 请求尝试使用 BatchWriteItems 更新项目.

  • 请求对单个项目执行多项操作.

  • 请求表不存在.

  • 请求中的项属性与目标不匹配.

  • 请求超出大小限制.

批量写入需要某些 RequestItem 参数 :

  • 删除操作需要 DeleteRequest 子元素表示属性名称和值.

  • PutRequest 项需要 Item子元素表示属性和属性值映射.

响应 : 成功的操作会产生HTTP 200响应,表示消耗的容量单位,表处理指标和任何未处理的项目等特性.

使用Java批量写入

通过创建DynamoDB类实例,描述所有操作的 TableWriteItems 类实例,并调用 batchWriteItem 方法来使用TableWriteItems对象来执行批量写入.

注意 : 您必须为批处理写入多个表中的每个表创建一个TableWriteItems实例.另外,检查您对任何未处理请求的请求响应.

您可以查看以下批量写入和减去的示例;

DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient(    new ProfileCredentialsProvider()));  TableWriteItems forumTableWriteItems = new TableWriteItems("Forum")    .withItemsToPut(    new Item()    .withPrimaryKey("Title", "XYZ CRM")    .withNumber("Threads", 0));  TableWriteItems threadTableWriteItems = new TableWriteItems(Thread)    .withItemsToPut(    new Item()    .withPrimaryKey("ForumTitle","XYZ CRM","Topic","Updates")    .withHashAndRangeKeysToDelete("ForumTitle","A partition key value",    "Product Line 1", "A sort key value"));BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem (   forumTableWriteItems, threadTableWriteItems);

以下程序是另一个更好的例子,可以更好地理解批处理如何用Java编写.

注意 : 以下示例可以假定先前创建的数据源.在尝试执行之前,获取支持库并创建必要的数据源(具有所需特征的表或其他引用的源).

此示例还使用Eclipse IDE,AWS凭证文件和Eclipse AWS Java项目中的AWS Toolkit.

package com.amazonaws.codesamples.document;import java.io.IOException;import java.util.Arrays;import java.util.HashSet;import java.util.List;import java.util.Map;import com.amazonaws.auth.profile.ProfileCredentialsProvider;import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;import com.amazonaws.services.dynamodbv2.document.BatchWriteItemOutcome;import com.amazonaws.services.dynamodbv2.document.DynamoDB;import com.amazonaws.services.dynamodbv2.document.Item;import com.amazonaws.services.dynamodbv2.document.TableWriteItems;import com.amazonaws.services.dynamodbv2.model.WriteRequest;public class BatchWriteOpSample {     static DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient(       new ProfileCredentialsProvider()));     static String forumTableName = "Forum";    static String threadTableName = "Thread";           public static void main(String[] args) throws IOException {       batchWriteMultiItems();      }   private static void batchWriteMultiItems() {       try {         // Place new item in Forum          TableWriteItems forumTableWriteItems = new TableWriteItems(forumTableName)                                                                        //Forum             .withItemsToPut(new Item()             .withPrimaryKey("Name", "Amazon RDS")             .withNumber("Threads", 0));                       // Place one item, delete another in Thread          // Specify partition key and range key          TableWriteItems threadTableWriteItems = new TableWriteItems(threadTableName)             .withItemsToPut(new Item()             .withPrimaryKey("ForumName","Product              Support","Subject","Support Thread 1")             .withString("Message", "New OS Thread 1 message")            .withHashAndRangeKeysToDelete("ForumName","Subject", "Polymer Blaster",             "Support Thread 100"));                       System.out.println("Processing request...");          BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem (               forumTableWriteItems, threadTableWriteItems);         do {              // Confirm no unprocessed items             Map> unprocessedItems                = outcome.getUnprocessedItems();                                if (outcome.getUnprocessedItems().size() == 0) {                System.out.println("All items processed.");             } else {                System.out.println("Gathering unprocessed items...");                outcome = dynamoDB.batchWriteItemUnprocessed(unprocessedItems);             }           } while (outcome.getUnprocessedItems().size() > 0);        } catch (Exception e) {          System.err.println("Could not get items: ");          e.printStackTrace(System.err);       }      } }