DynamoDB - escrita em lote

A gravação em lote opera em vários itens, criando ou excluindo vários itens. Essas operações utilizamBatchWriteItem, que carrega as limitações de no máximo 16 MB de gravações e 25 solicitações. Cada item obedece a um limite de tamanho de 400 KB. As gravações em lote também não podem realizar atualizações de itens.

O que é escrita em lote?

As gravações em lote podem manipular itens em várias tabelas. A invocação da operação acontece para cada solicitação individual, o que significa que as operações não afetam umas às outras e combinações heterogêneas são permitidas; por exemplo, umPutItem e três DeleteItemsolicitações em lote, com a falha da solicitação PutItem não afetando as outras. As solicitações com falha resultam na operação retornando informações (chaves e dados) pertencentes a cada solicitação com falha.

Note- Se o DynamoDB retornar algum item sem processá-lo, tente novamente; no entanto, use um método de retirada para evitar outra falha de solicitação com base na sobrecarga.

O DynamoDB rejeita uma operação de gravação em lote quando uma ou mais das seguintes afirmações se comprovam verdadeiras -

  • A solicitação excede a taxa de transferência provisionada.

  • A solicitação tenta usar BatchWriteItems para atualizar um item.

  • A solicitação executa várias operações em um único item.

  • As tabelas de solicitação não existem.

  • Os atributos do item na solicitação não correspondem ao destino.

  • As solicitações excedem os limites de tamanho.

As gravações em lote exigem certas RequestItem parâmetros -

  • As operações de exclusão precisam DeleteRequest chave subelements significando um nome e valor de atributo.

  • o PutRequest itens requerem um Item subelement significando um atributo e um mapa de valor de atributo.

Response - Uma operação bem-sucedida resulta em uma resposta HTTP 200, que indica características como unidades de capacidade consumidas, métricas de processamento de tabela e quaisquer itens não processados.

Gravações em lote com Java

Execute uma gravação em lote criando uma instância de classe DynamoDB, um TableWriteItems instância de classe descrevendo todas as operações e chamando o batchWriteItem método para usar o objeto TableWriteItems.

Note- Você deve criar uma instância TableWriteItems para cada tabela em uma gravação em lote em várias tabelas. Além disso, verifique sua resposta de solicitação para quaisquer solicitações não processadas.

Você pode revisar o seguinte exemplo de gravação em lote -

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

O programa a seguir é outro exemplo maior para melhor compreensão de como um lote grava com Java.

Note- O exemplo a seguir pode assumir uma fonte de dados criada anteriormente. Antes de tentar executar, adquira bibliotecas de suporte e crie as fontes de dados necessárias (tabelas com as características necessárias ou outras fontes referenciadas).

Este exemplo também usa Eclipse IDE, um arquivo de credenciais AWS e o AWS Toolkit em um projeto 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); 
      }   
   } 
}