DynamoDB - Penulisan Batch
Penulisan batch beroperasi pada banyak item dengan membuat atau menghapus beberapa item. Operasi ini memanfaatkanBatchWriteItem, yang memiliki batasan tidak lebih dari 16MB tulis dan 25 permintaan. Setiap item mematuhi batas ukuran 400 KB. Penulisan batch juga tidak dapat melakukan pembaruan item.
Apa itu Penulisan Batch?
Penulisan batch dapat memanipulasi item di beberapa tabel. Permintaan operasi terjadi untuk setiap permintaan individu, yang berarti operasi tidak berdampak satu sama lain, dan campuran heterogen diizinkan; misalnya satuPutItem dan tiga DeleteItempermintaan dalam batch, dengan kegagalan permintaan PutItem tidak memengaruhi yang lain. Permintaan yang gagal mengakibatkan operasi mengembalikan informasi (kunci dan data) yang berkaitan dengan setiap permintaan yang gagal.
Note- Jika DynamoDB mengembalikan item apa pun tanpa memprosesnya, coba lagi; namun, gunakan metode back-off untuk menghindari kegagalan permintaan lain berdasarkan kelebihan beban.
DynamoDB menolak operasi penulisan batch ketika satu atau beberapa pernyataan berikut terbukti benar -
Permintaan melebihi throughput yang disediakan.
Permintaan tersebut mencoba untuk menggunakan BatchWriteItems untuk memperbarui item.
Permintaan tersebut melakukan beberapa operasi pada satu item.
Tabel permintaan tidak ada.
Atribut item dalam permintaan tidak sesuai dengan target.
Permintaan melebihi batas ukuran.
Batch menulis membutuhkan tertentu RequestItem parameter -
Operasi penghapusan perlu DeleteRequest kunci subelements artinya nama dan nilai atribut.
Itu PutRequest item membutuhkan Item subelement artinya peta nilai atribut dan atribut.
Response - Operasi yang berhasil menghasilkan respons HTTP 200, yang menunjukkan karakteristik seperti unit kapasitas yang digunakan, metrik pemrosesan tabel, dan item apa pun yang belum diproses.
Batch Writes with Java
Lakukan penulisan batch dengan membuat instance kelas DynamoDB, a TableWriteItems instance kelas yang menjelaskan semua operasi, dan memanggil batchWriteItem metode untuk menggunakan objek TableWriteItems.
Note- Anda harus membuat instance TableWriteItems untuk setiap tabel dalam batch tulis ke beberapa tabel. Selain itu, periksa respons permintaan Anda untuk setiap permintaan yang belum diproses.
Anda dapat meninjau contoh penulisan batch berikut -
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);
Program berikut adalah contoh lain yang lebih besar untuk pemahaman yang lebih baik tentang bagaimana sebuah batch menulis dengan Java.
Note- Contoh berikut dapat mengasumsikan sumber data yang dibuat sebelumnya. Sebelum mencoba untuk mengeksekusi, dapatkan pustaka pendukung dan buat sumber data yang diperlukan (tabel dengan karakteristik yang diperlukan, atau sumber referensi lainnya).
Contoh ini juga menggunakan Eclipse IDE, file kredensial AWS, dan AWS Toolkit dalam Proyek Java Eclipse AWS.
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);
}
}
}