DynamoDB - Écriture par lots

L'écriture par lots opère sur plusieurs éléments en créant ou en supprimant plusieurs éléments. Ces opérations utilisentBatchWriteItem, qui comporte les limitations de pas plus de 16 Mo d'écritures et 25 requêtes. Chaque élément obéit à une limite de taille de 400 Ko. Les écritures par lots ne peuvent pas non plus effectuer de mises à jour d'éléments.

Qu'est-ce que l'écriture par lots?

Les écritures par lots peuvent manipuler des éléments sur plusieurs tables. L'appel d'opération se produit pour chaque demande individuelle, ce qui signifie que les opérations ne se répercutent pas et que les mélanges hétérogènes sont autorisés; par exemple, unPutItem et trois DeleteItemrequêtes dans un lot, l'échec de la requête PutItem n'affectant pas les autres. Les demandes ayant échoué entraînent le retour d'informations (clés et données) relatives à chaque demande échouée.

Note- Si DynamoDB renvoie des éléments sans les traiter, réessayez-les; cependant, utilisez une méthode d'interruption pour éviter un autre échec de requête basé sur une surcharge.

DynamoDB rejette une opération d'écriture par lots lorsqu'une ou plusieurs des instructions suivantes s'avèrent vraies -

  • La demande dépasse le débit alloué.

  • La demande tente d'utiliser BatchWriteItems pour mettre à jour un élément.

  • La demande effectue plusieurs opérations sur un seul élément.

  • Les tables de requêtes n'existent pas.

  • Les attributs d'élément dans la demande ne correspondent pas à la cible.

  • Les demandes dépassent les limites de taille.

Les écritures par lots nécessitent certaines RequestItem paramètres -

  • Les opérations de suppression nécessitent DeleteRequest clé subelements signifiant un nom et une valeur d'attribut.

  • le PutRequest les articles nécessitent un Item subelement signifiant une carte d'attribut et de valeur d'attribut.

Response - Une opération réussie entraîne une réponse HTTP 200, qui indique des caractéristiques telles que les unités de capacité consommées, les métriques de traitement de table et tout élément non traité.

Écrit par lots avec Java

Effectuez une écriture par lots en créant une instance de classe DynamoDB, un TableWriteItems instance de classe décrivant toutes les opérations et appelant le batchWriteItem méthode pour utiliser l'objet TableWriteItems.

Note- Vous devez créer une instance TableWriteItems pour chaque table d'une écriture par lots dans plusieurs tables. Vérifiez également votre réponse à la demande pour toute demande non traitée.

Vous pouvez consulter l'exemple suivant d'écriture par lots -

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

Le programme suivant est un autre exemple plus complet permettant de mieux comprendre comment un lot écrit avec Java.

Note- L'exemple suivant peut supposer une source de données précédemment créée. Avant d'essayer de l'exécuter, acquérez les bibliothèques de prise en charge et créez les sources de données nécessaires (tables avec les caractéristiques requises ou autres sources référencées).

Cet exemple utilise également Eclipse IDE, un fichier d'informations d'identification AWS et AWS Toolkit dans un projet Eclipse AWS Java.

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