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 工具包。

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); 
      }   
   } 
}
廣告

© . All rights reserved.