この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Dynamoでatmic counter(シーケンス)を使う
以前、Dynamoでシーケンスを使う方法を紹介しました。 ことのきはAttributeUpdatesとnode.jsを使っていましたが、最近ではUpdateExpressionを使うのが一般的のようなので、 その方法を使ってJavaで実装してみます。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.10.5
- Java : 1.8.0_51
- AWS SDK for Java : 1.10.51
サンプルプログラム
今回紹介するのは、ここで紹介されている方法のJavaバージョンです。 まずはシーケンス用のDynamoテーブルを作成します。 ここでは「sequenceName」という名前でString型のHashキーを指定してシーケンス用テーブルを作成しました。
テーブルを作ったら、AWS SDKを使える状態にしたあと、下記のようにJavaプログラムを作成していきます。
・
・
DynamoDB dynamoDB = null;
//~/.aws/credentialsに設定があること
AmazonDynamoDBClient cli = new AmazonDynamoDBClient();
cli.setRegion("<リージョン>");
dynamoDB = new DynamoDB(cli);
・
・
DynamoDBオブジェクトを作成してリージョンを指定しています。 続いて下記のような関数を定義します。
public String getSequence(DynamoDB dynamoDB,String sequenceName) {
if (name == null) {
return null;
}
Table table = dynamoDB.getTable("<Dynamoテーブル名>");
String count = null;
try {
UpdateItemSpec updateItemSpec = new UpdateItemSpec()
.withPrimaryKey("sequenceName", sequenceName)
.withReturnValues(ReturnValue.UPDATED_NEW)
.withUpdateExpression("add #count :i")
.withNameMap(new NameMap().with("#count", "count"))
.withValueMap(new ValueMap().withNumber(":i", 1));
UpdateItemOutcome outcome = table.updateItem(updateItemSpec);
count = outcome.getItem().getString("count");
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return count;
}
ここでシーケンスの採番を行います。 シーケンスはDynamoで管理され、sequenceName毎にそれぞれ、呼び出すたびにインクリメントされていきます。
String count = getSequence(dynamo,"mySequenceName");