DynamoDB - Viết hàng loạt

Viết hàng loạt hoạt động trên nhiều mục bằng cách tạo hoặc xóa một số mục. Các hoạt động này sử dụngBatchWriteItem, có giới hạn là không quá 16MB ghi và 25 yêu cầu. Mỗi mặt hàng tuân theo giới hạn kích thước 400KB. Ghi hàng loạt cũng không thể thực hiện cập nhật mặt hàng.

Viết theo lô là gì?

Ghi hàng loạt có thể thao tác các mục trên nhiều bảng. Lệnh gọi hoạt động xảy ra cho từng yêu cầu riêng lẻ, có nghĩa là các hoạt động không tác động lẫn nhau và cho phép các hỗn hợp không đồng nhất; ví dụ, mộtPutItem và ba DeleteItemyêu cầu trong một lô, với sự thất bại của yêu cầu PutItem không ảnh hưởng đến những yêu cầu khác. Yêu cầu không thành công dẫn đến hoạt động trả về thông tin (khóa và dữ liệu) liên quan đến mỗi yêu cầu không thành công.

Note- Nếu DynamoDB trả về bất kỳ mục nào mà không xử lý chúng, hãy thử lại chúng; tuy nhiên, hãy sử dụng phương pháp back-off để tránh một yêu cầu khác bị lỗi do quá tải.

DynamoDB từ chối thao tác ghi hàng loạt khi một hoặc nhiều câu lệnh sau được chứng minh là đúng:

  • Yêu cầu vượt quá thông lượng được cung cấp.

  • Yêu cầu cố gắng sử dụng BatchWriteItems để cập nhật một mặt hàng.

  • Yêu cầu thực hiện một số hoạt động trên một mục duy nhất.

  • Các bảng yêu cầu không tồn tại.

  • Các thuộc tính vật phẩm trong yêu cầu không khớp với mục tiêu.

  • Các yêu cầu vượt quá giới hạn kích thước.

Ghi hàng loạt yêu cầu nhất định RequestItem tham số -

  • Thao tác xóa cần DeleteRequest Chìa khóa subelements nghĩa là một tên thuộc tính và giá trị.

  • Các PutRequest các mặt hàng yêu cầu một Item subelement nghĩa là một thuộc tính và bản đồ giá trị thuộc tính.

Response - Hoạt động thành công dẫn đến phản hồi HTTP 200, cho biết các đặc điểm như đơn vị dung lượng tiêu thụ, số liệu xử lý bảng và bất kỳ mục nào chưa được xử lý.

Viết hàng loạt với Java

Thực hiện ghi hàng loạt bằng cách tạo một cá thể lớp DynamoDB, TableWriteItems cá thể lớp mô tả tất cả các hoạt động và gọi batchWriteItem để sử dụng đối tượng TableWriteItems.

Note- Bạn phải tạo một cá thể TableWriteItems cho mọi bảng trong một đợt ghi vào nhiều bảng. Ngoài ra, hãy kiểm tra phản hồi yêu cầu của bạn để biết bất kỳ yêu cầu nào chưa được xử lý.

Bạn có thể xem lại ví dụ sau về ghi hàng loạt:

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

Chương trình sau đây là một ví dụ lớn hơn để hiểu rõ hơn về cách một loạt ghi bằng Java.

Note- Ví dụ sau có thể giả sử một nguồn dữ liệu đã tạo trước đó. Trước khi cố gắng thực thi, hãy thu thập các thư viện hỗ trợ và tạo các nguồn dữ liệu cần thiết (các bảng có các đặc điểm bắt buộc hoặc các nguồn tham chiếu khác).

Ví dụ này cũng sử dụng Eclipse IDE, tệp thông tin đăng nhập AWS và Bộ công cụ AWS trong Dự án Java AWS của Eclipse.

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