[Java編] Dynamoでupdateexpressionを使ったカウンター

2016.02.10

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

参考サイトなど