- DynamoDB 教程
- DynamoDB - 首頁
- DynamoDB - 概述
- DynamoDB - 基本概念
- DynamoDB - 環境
- DynamoDB - 操作工具
- DynamoDB - 資料型別
- DynamoDB - 建立表
- DynamoDB - 載入表
- DynamoDB - 查詢表
- DynamoDB - 刪除表
- DynamoDB - API 介面
- DynamoDB - 建立專案
- DynamoDB - 獲取專案
- DynamoDB - 更新專案
- DynamoDB - 刪除專案
- DynamoDB - 批次寫入
- DynamoDB - 批次檢索
- DynamoDB - 查詢
- DynamoDB - 掃描
- DynamoDB - 索引
- 全域性二級索引
- 本地二級索引
- DynamoDB - 聚合
- DynamoDB - 訪問控制
- DynamoDB - 許可權 API
- DynamoDB - 條件
- Web 身份聯合
- DynamoDB - 資料管道
- DynamoDB - 資料備份
- DynamoDB - 監控
- DynamoDB - CloudTrail
- DynamoDB - MapReduce
- DynamoDB - 表格活動
- DynamoDB - 錯誤處理
- DynamoDB - 最佳實踐
- DynamoDB 有用資源
- DynamoDB - 快速指南
- DynamoDB - 有用資源
- DynamoDB - 討論
DynamoDB - 批次寫入
批次寫入透過建立或刪除多個專案來操作多個專案。這些操作利用BatchWriteItem,它受寫入不超過 16MB 和 25 個請求的限制。每個專案都遵守 400KB 的大小限制。批次寫入也不能執行專案更新。
什麼是批次寫入?
批次寫入可以跨多個表操作專案。每個單獨的請求都會發生操作呼叫,這意味著操作不會相互影響,並且允許異構混合;例如,在一個批次中有一個PutItem和三個DeleteItem請求,其中PutItem請求的失敗不會影響其他請求。失敗的請求會導致操作返回與每個失敗請求相關的的資訊(鍵和資料)。
注意 - 如果 DynamoDB 返回任何未處理的專案,請重試;但是,請使用退避方法以避免由於過載而導致的另一個請求失敗。
當以下一個或多個語句被證明為真時,DynamoDB 會拒絕批次寫入操作 -
請求超過了預配的吞吐量。
請求嘗試使用BatchWriteItems更新專案。
請求對單個專案執行多個操作。
請求的表不存在。
請求中的專案屬性與目標不匹配。
請求超過了大小限制。
批次寫入需要某些RequestItem引數 -
刪除操作需要DeleteRequest鍵子元素,這意味著屬性名稱和值。
PutRequest專案需要一個Item 子元素,這意味著屬性和屬性值對映。
響應 - 成功操作將產生 HTTP 200 響應,指示諸如消耗的容量單位、表處理指標和任何未處理的專案等特性。
使用 Java 進行批次寫入
透過建立 DynamoDB 類例項、描述所有操作的TableWriteItems類例項以及呼叫batchWriteItem方法以使用 TableWriteItems 物件來執行批次寫入。
注意 - 您必須為批次寫入到多個表中的每個表建立一個 TableWriteItems 例項。此外,請檢查您的請求響應中是否存在任何未處理的請求。
您可以檢視以下批次寫入示例 -
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);
以下程式是另一個更大的示例,可以更好地理解如何在 Java 中進行批次寫入。
注意 - 以下示例可能假設先前建立的資料來源。在嘗試執行之前,請獲取支援庫並建立必要的資料來源(具有所需特徵的表或其他引用的源)。
此示例還使用 Eclipse IDE、AWS 憑據檔案以及 Eclipse AWS Java 專案中的 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);
}
}
}