DynamoDBクライアントのbatchWriteItemsとbatchGetItemsを利用する
日本語のサンプルページが少ないのでエントリ作成。本稿は2013-11-19時点でのものです。
AWS SDK for Javaのバージョンは1.7です。
modelパッケージのDeleteRequestとPutRequest、WriteRequestを利用するのですが、インターフェースになっていないのでそれぞれ処理が別になるので面倒です。
保存と削除
保存と削除はDynamoDBClient#batchWriteItemメソッドを利用します。
WriteRequestクラスでPutRequestをラップするかDeleteRequestをラップするかの違いだけで処理の流れはほぼ同じです。PutRequestとDeleteRequestが共通インターフェースだったらまとめて記述しやすいのにと考えてしまいますが今後に期待します。
保存
// 一括保存する情報をテーブル名 => 条件リストに格納
Map<String,List<WriteRequest>> itemMap = new HashMap<String,List<WriteRequest>>();
// 保存リクエスト作成
PutRequest putReq = new PutRequest();
delReq.addItemEntry(fieldName, new AttributeValue().withS(value));
// 書き込みリクエストでラッピング
WriteRequest writeReq = new WriteRequest(putReq);
// 一括処理のマップに追加
itemMap.put(tableName, writeReq);
// バッチ書き込みリクエストに格納
BatchWriteItemRequest request = new BatchWriteItemRequest();
request.setRequestItems(itemMap);
// 一括処理実行
dynamoClient.batchWriteItem(request);
削除
// 一括削除する情報をテーブル名 => 削除条件リストに格納
Map<String,List<WriteRequest>> itemMap = new HashMap<String,List<WriteRequest>>();
// 削除リクエスト作成
DeleteRequest delReq = new DeleteRequest();
delReq.addKeyEntry(keyName, new AttributeValue().withS(value));
// 書き込みリクエストでラッピング
WriteRequest writeReq = new WriteRequest(delReq);
// 一括処理のマップに追加
itemMap.put(tableName, writeReq);
// バッチ書き込みリクエストに格納
BatchWriteItemRequest request = new BatchWriteItemRequest();
request.setRequestItems(itemMap);
// 一括処理実行
dynamoClient.batchWriteItem(request);
DeleteRequest, PutRequestを作成する部分以外は共通なのでその作成部分を共通化して抜き出せばきれいな流れで削除と保存をおりまぜて一括処理できるのでリクエスト回数を減らすのに役立ちます。
読み込み
複数のキーを指定して一括でGetしてみます。
BatchGetItemRequest request = new BatchGetItemRequest();
// 複数条件のリスト
List<Map<String,AttributeValue>> conditions = new ArrayList<Map<String,AttributeValue>>();
// 取得条件(ハッシュキーと必要に応じてレンジキーを指定) .. ここから必要に応じて複数回処理
Map<String,AttributeValue> cond = new HashMap<String,AttributeValue>();
cond.put(fieldName, new AttributeValue().withS(fieldValue);
conditions.add(cond);
// 条件をラッピング
KeysAndAttributes keys = new KeysAndAttributes().withKeys(conditions);
request.addRequestItemEntry(tableName, keys);
BatchGetItemResult result = this.client.batchGetItem(request);
Map<String,List<Map<String,AttributeValue>>> resulstMap = result.getResponses();
一括取得も含めて処理が煩雑になってしまいがちな作りかもしれません。
上記コードを含みIOをJSONに統一した簡単なWrapperをgithubにあげましたのでよろしければご参考までに。