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