DynamoDB - 批量写入
批量写入通过创建或删除多个项目来对多个项目进行操作。 这些操作利用 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<String, List<WriteRequest>> 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); } } }