DynamoDB: escritura por lotes

La escritura por lotes opera en varios elementos al crear o eliminar varios elementos. Estas operaciones utilizanBatchWriteItem, que tiene las limitaciones de no más de 16 MB de escrituras y 25 solicitudes. Cada artículo obedece a un límite de tamaño de 400 KB. Las escrituras por lotes tampoco pueden realizar actualizaciones de elementos.

¿Qué es la escritura por lotes?

Las escrituras por lotes pueden manipular elementos en varias tablas. La invocación de la operación ocurre para cada solicitud individual, lo que significa que las operaciones no se impactan entre sí y se permiten mezclas heterogéneas; por ejemplo, unoPutItem y tres DeleteItemsolicitudes en un lote, y la falla de la solicitud PutItem no afecta a las demás. Las solicitudes fallidas dan como resultado que la operación devuelva información (claves y datos) perteneciente a cada solicitud fallida.

Note- Si DynamoDB devuelve elementos sin procesarlos, vuelva a intentarlo; sin embargo, utilice un método de retroceso para evitar otro error de solicitud debido a la sobrecarga.

DynamoDB rechaza una operación de escritura por lotes cuando una o más de las siguientes declaraciones resultan ser ciertas:

  • La solicitud supera el rendimiento aprovisionado.

  • La solicitud intenta usar BatchWriteItems para actualizar un artículo.

  • La solicitud realiza varias operaciones en un solo artículo.

  • Las tablas de solicitudes no existen.

  • Los atributos del artículo en la solicitud no coinciden con el objetivo.

  • Las solicitudes superan los límites de tamaño.

Las escrituras por lotes requieren ciertas RequestItem parámetros -

  • Las operaciones de eliminación necesitan DeleteRequest llave subelements es decir, un nombre y valor de atributo.

  • los PutRequest los artículos requieren un Item subelement es decir, un atributo y mapa de valor de atributo.

Response - Una operación exitosa da como resultado una respuesta HTTP 200, que indica características como unidades de capacidad consumidas, métricas de procesamiento de tablas y cualquier elemento no procesado.

Escrituras por lotes con Java

Realice una escritura por lotes creando una instancia de clase DynamoDB, una TableWriteItems instancia de clase que describe todas las operaciones y llama al batchWriteItem método para utilizar el objeto TableWriteItems.

Note- Debe crear una instancia de TableWriteItems para cada tabla en una escritura por lotes en varias tablas. Además, verifique la respuesta de su solicitud para ver si hay solicitudes no procesadas.

Puede revisar el siguiente ejemplo de escritura por lotes:

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

El siguiente programa es otro ejemplo más grande para comprender mejor cómo se escribe un lote con Java.

Note- El siguiente ejemplo puede asumir una fuente de datos creada previamente. Antes de intentar ejecutar, adquiera bibliotecas de soporte y cree las fuentes de datos necesarias (tablas con las características requeridas u otras fuentes referenciadas).

Este ejemplo también utiliza Eclipse IDE, un archivo de credenciales de AWS y AWS Toolkit dentro de un proyecto 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); 
      }   
   } 
}