DynamoDB教程

DynamoDB 批量写入

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

什么是批量写入?

批量写入可以跨多个表操作项目。操作调用针对每个单独的请求进行,这意味着操作不会相互影响,并且允许异构混合;例如,一个 PutItem 和三个 DeleteItem 请求批量处理,PutItem 请求失败不会影响其他请求。失败的请求会导致操作返回与每个失败请求相关的信息(密钥和数据)。
注意-如果 DynamoDB 返回任何项目而不处理它们,请重试它们;但是,使用回退方法来避免基于重载的另一个请求失败。
当以下一项或多项陈述被证明为真时,DynamoDB 拒绝批量写入操作-
请求超出了预配置的吞吐量。 请求尝试使用 BatchWriteItems 来更新项目。 请求对单个项目执行多项操作。 请求表不存在。 请求中的商品属性与目标不匹配。 请求超出了大小限制。
批量写入需要某些 RequestItem 参数-
删除操作需要 DeleteRequest子元素 表示属性名称和值。 PutRequest 项需要一个 Item 子元素,表示属性和属性值映射。
Response-成功的操作会产生 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 工具包。
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); 
      }   
   } 
}
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4