DynamoDB-バッチ書き込み

バッチ書き込みは、複数のアイテムを作成または削除することにより、複数のアイテムに対して機能します。これらの操作はBatchWriteItem、16MB以下の書き込みと25リクエストの制限があります。各アイテムは400KBのサイズ制限に従います。バッチ書き込みでもアイテムの更新は実行できません。

バッチ書き込みとは何ですか?

バッチ書き込みでは、複数のテーブルにまたがるアイテムを操作できます。操作の呼び出しは個々の要求ごとに発生します。つまり、操作は相互に影響を与えず、異種混合が許可されます。たとえば、1つPutItem と3つ DeleteItemバッチ内のリクエスト。PutItemリクエストの失敗は他のリクエストに影響を与えません。失敗した要求により、操作は失敗した各要求に関連する情報(キーとデータ)を返します。

Note− DynamoDBがアイテムを処理せずに返す場合は、それらを再試行します。ただし、オーバーロードに基づく別のリクエストの失敗を回避するには、バックオフ方式を使用してください。

以下のステートメントの1つ以上が真であることが証明された場合、DynamoDBはバッチ書き込み操作を拒否します-

  • リクエストがプロビジョニングされたスループットを超えています。

  • リクエストは使用しようとします BatchWriteItems アイテムを更新します。

  • リクエストは、1つのアイテムに対して複数の操作を実行します。

  • リクエストテーブルが存在しません。

  • リクエストのアイテム属性がターゲットと一致しません。

  • リクエストがサイズ制限を超えています。

バッチ書き込みには特定のものが必要です RequestItem パラメータ-

  • 削除操作が必要 DeleteRequest キー subelements 属性名と値を意味します。

  • ザ・ PutRequest アイテムには Item subelement 属性と属性値マップを意味します。

Response −操作が成功すると、HTTP 200応答が生成されます。これは、消費された容量単位、テーブル処理メトリック、および未処理のアイテムなどの特性を示します。

Javaでのバッチ書き込み

DynamoDBクラスインスタンスを作成してバッチ書き込みを実行します。 TableWriteItems すべての操作を記述し、を呼び出すクラスインスタンス batchWriteItem TableWriteItemsオブジェクトを使用するメソッド。

Note−複数のテーブルへのバッチ書き込みでは、すべてのテーブルに対して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でどのように書き込むかをよりよく理解するためのもう1つの大きな例です。

Note−次の例では、以前に作成されたデータソースを想定しています。実行を試みる前に、サポートライブラリを取得し、必要なデータソース(必要な特性を持つテーブル、またはその他の参照ソース)を作成します。

この例では、Eclipse IDE、AWS認証情報ファイル、およびEclipse AWSJavaプロジェクト内のAWSToolkitも使用しています。

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