DynamoDB - Truy xuất hàng loạt
Các hoạt động Truy xuất hàng loạt trả về các thuộc tính của một hoặc nhiều mục. Các hoạt động này thường bao gồm việc sử dụng khóa chính để xác định (các) mục mong muốn. CácBatchGetItem các hoạt động phải tuân theo các giới hạn của các hoạt động riêng lẻ cũng như các ràng buộc riêng của chúng.
Các yêu cầu sau trong hoạt động truy xuất hàng loạt dẫn đến việc bị từ chối:
- Thực hiện một yêu cầu cho hơn 100 mặt hàng.
- Thực hiện một yêu cầu vượt quá thông lượng.
Các hoạt động truy xuất hàng loạt thực hiện xử lý từng phần các yêu cầu có khả năng vượt quá giới hạn.
For example- yêu cầu truy xuất nhiều mục có kích thước đủ lớn để vượt quá giới hạn dẫn đến một phần của quá trình xử lý yêu cầu và thông báo lỗi ghi nhận phần chưa được xử lý. Khi trả lại các mặt hàng chưa được xử lý, hãy tạo một giải pháp thuật toán dự phòng để quản lý điều này thay vì điều chỉnh các bảng.
Các BatchGetcác hoạt động thực hiện cuối cùng với các lần đọc nhất quán, yêu cầu sửa đổi cho các phép đọc nhất quán mạnh mẽ. Họ cũng thực hiện truy xuất song song.
Note- Thứ tự của các mặt hàng trả lại. DynamoDB không sắp xếp các mục. Nó cũng không chỉ ra sự vắng mặt của các mặt hàng được yêu cầu. Hơn nữa, những yêu cầu đó tiêu tốn đơn vị dung lượng.
Tất cả các hoạt động BatchGet yêu cầu RequestItems các tham số như độ nhất quán đọc, tên thuộc tính và khóa chí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ý.
Truy xuất hàng loạt với Java
Sử dụng Java trong các hoạt động BatchGet yêu cầu tạo một phiên bản lớp DynamoDB, TableKeysAndAttributes cá thể lớp mô tả danh sách giá trị khóa chính cho các mục và chuyển đối tượng TableKeysAndAttributes tới BatchGetItem phương pháp.
Sau đây là một ví dụ về hoạt động BatchGet:
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient (
new ProfileCredentialsProvider()));
TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes
(forumTableName);
forumTableKeysAndAttributes.addHashOnlyPrimaryKeys (
"Title",
"Updates",
"Product Line 1"
);
TableKeysAndAttributes threadTableKeysAndAttributes = new TableKeysAndAttributes (
threadTableName);
threadTableKeysAndAttributes.addHashAndRangePrimaryKeys (
"ForumTitle",
"Topic",
"Product Line 1",
"P1 Thread 1",
"Product Line 1",
"P1 Thread 2",
"Product Line 2",
"P2 Thread 1"
);
BatchGetItemOutcome outcome = dynamoDB.batchGetItem (
forumTableKeysAndAttributes, threadTableKeysAndAttributes);
for (String tableName : outcome.getTableItems().keySet()) {
System.out.println("Table items " + tableName);
List<Item> items = outcome.getTableItems().get(tableName);
for (Item item : items) {
System.out.println(item);
}
}
Bạn có thể xem lại ví dụ lớn hơn sau đây.
Note- Chương trình 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).
Chương trình 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.List;
import java.util.Map;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.BatchGetItemOutcome;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.TableKeysAndAttributes;
import com.amazonaws.services.dynamodbv2.model.KeysAndAttributes;
public class BatchGetOpSample {
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 {
retrieveMultipleItemsBatchGet();
}
private static void retrieveMultipleItemsBatchGet() {
try {
TableKeysAndAttributes forumTableKeysAndAttributes =
new TableKeysAndAttributes(forumTableName);
//Create partition key
forumTableKeysAndAttributes.addHashOnlyPrimaryKeys (
"Name",
"XYZ Melt-O-tron",
"High-Performance Processing"
);
TableKeysAndAttributes threadTableKeysAndAttributes =
new TableKeysAndAttributes(threadTableName);
//Create partition key and sort key
threadTableKeysAndAttributes.addHashAndRangePrimaryKeys (
"ForumName",
"Subject",
"High-Performance Processing",
"HP Processing Thread One",
"High-Performance Processing",
"HP Processing Thread Two",
"Melt-O-Tron",
"MeltO Thread One"
);
System.out.println("Processing...");
BatchGetItemOutcome outcome = dynamoDB.batchGetItem(forumTableKeysAndAttributes,
threadTableKeysAndAttributes);
Map<String, KeysAndAttributes> unprocessed = null;
do {
for (String tableName : outcome.getTableItems().keySet()) {
System.out.println("Table items for " + tableName);
List<Item> items = outcome.getTableItems().get(tableName);
for (Item item : items) {
System.out.println(item.toJSONPretty());
}
}
// Confirm no unprocessed items
unprocessed = outcome.getUnprocessedKeys();
if (unprocessed.isEmpty()) {
System.out.println("All items processed.");
} else {
System.out.println("Gathering unprocessed items...");
outcome = dynamoDB.batchGetItemUnprocessed(unprocessed);
}
} while (!unprocessed.isEmpty());
} catch (Exception e) {
System.err.println("Could not get items.");
System.err.println(e.getMessage());
}
}
}