Amazon DynamoDB を使用している Java アプリケーションがすでにある場合、DynamoDB Accelerator (DAX) クラスターにアクセスできるように変更する必要があります。DAX Java クライアントは、AWS SDK for Java に含まれる DynamoDB 低レベルクライアントとよく似ているため、アプリケーション全体を書き換える必要はありません。
注記
これらの手順は、AWS SDK for Java 1.x を使用するアプリケーション向けです。AWS SDK for Java 2.x を使用するアプリケーションの場合は、「既存のアプリケーションを DAX を使用するように変更する」を参照してください。
Music
という名前の DynamoDB テーブルがあるとします。テーブルのパーティションキーは Artist
で、ソートキーは SongTitle
です。次のプログラムは、Music
テーブルから直接項目を読み込みます。
import java.util.HashMap;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import com.amazonaws.services.dynamodbv2.model.GetItemResult;
public class GetMusicItem {
public static void main(String[] args) throws Exception {
// Create a DynamoDB client
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
HashMap<String, AttributeValue> key = new HashMap<String, AttributeValue>();
key.put("Artist", new AttributeValue().withS("No One You Know"));
key.put("SongTitle", new AttributeValue().withS("Scared of My Shadow"));
GetItemRequest request = new GetItemRequest()
.withTableName("Music").withKey(key);
try {
System.out.println("Attempting to read the item...");
GetItemResult result = client.getItem(request);
System.out.println("GetItem succeeded: " + result);
} catch (Exception e) {
System.err.println("Unable to read item");
System.err.println(e.getMessage());
}
}
}
プログラムを変更するには、DynamoDB クライアントを DAX クライアントに置き換えます。
import java.util.HashMap;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazon.dax.client.dynamodbv2.AmazonDaxClientBuilder;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import com.amazonaws.services.dynamodbv2.model.GetItemResult;
public class GetMusicItem {
public static void main(String[] args) throws Exception {
//Create a DAX client
AmazonDaxClientBuilder daxClientBuilder = AmazonDaxClientBuilder.standard();
daxClientBuilder.withRegion("us-east-1").withEndpointConfiguration("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111");
AmazonDynamoDB client = daxClientBuilder.build();
/*
** ...
** Remaining code omitted (it is identical)
** ...
*/
}
}
DynamoDB ドキュメント API を使用する
AWS SDK for Java は DynamoDB 向けのドキュメントインターフェイスを提供します。ドキュメント API は、低レベル DynamoDB クライアントのラッパーとして機能します。詳細については、「ドキュメントインターフェイス」を参照してください。
ドキュメントインターフェイスは、次の例に示すように、低レベル DAX クライアントとともに使用することもできます。
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazon.dax.client.dynamodbv2.AmazonDaxClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.GetItemOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;
public class GetMusicItemWithDocumentApi {
public static void main(String[] args) throws Exception {
//Create a DAX client
AmazonDaxClientBuilder daxClientBuilder = AmazonDaxClientBuilder.standard();
daxClientBuilder.withRegion("us-east-1").withEndpointConfiguration("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111");
AmazonDynamoDB client = daxClientBuilder.build();
// Document client wrapper
DynamoDB docClient = new DynamoDB(client);
Table table = docClient.getTable("Music");
try {
System.out.println("Attempting to read the item...");
GetItemOutcome outcome = table.tgetItemOutcome(
"Artist", "No One You Know",
"SongTitle", "Scared of My Shadow");
System.out.println(outcome.getItem());
System.out.println("GetItem succeeded: " + outcome);
} catch (Exception e) {
System.err.println("Unable to read item");
System.err.println(e.getMessage());
}
}
}
DAX 非同期クライアント
AmazonDaxClient
は同期します。大きいテーブルの Scan
のように長期間実行する DAX API オペレーションでは、そのオペレーションが完了するまでプログラムの実行がブロックされることがあります。DAX API オペレーションの処理中にプログラムで他の作業を実行する必要がある場合は、代わりに ClusterDaxAsyncClient
を使用できます。
次のプログラムは、ClusterDaxAsyncClient
を Java Future
と併せて使用し、ノンブロッキングソリューションを実装する方法を示します。
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import com.amazon.dax.client.dynamodbv2.ClientConfig;
import com.amazon.dax.client.dynamodbv2.ClusterDaxAsyncClient;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.handlers.AsyncHandler;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsync;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import com.amazonaws.services.dynamodbv2.model.GetItemResult;
public class DaxAsyncClientDemo {
public static void main(String[] args) throws Exception {
ClientConfig daxConfig = new ClientConfig().withCredentialsProvider(new ProfileCredentialsProvider())
.withEndpoints("mydaxcluster.2cmrwl.clustercfg.dax.use1.cache.amazonaws.com:8111");
AmazonDynamoDBAsync client = new ClusterDaxAsyncClient(daxConfig);
HashMap<String, AttributeValue> key = new HashMap<String, AttributeValue>();
key.put("Artist", new AttributeValue().withS("No One You Know"));
key.put("SongTitle", new AttributeValue().withS("Scared of My Shadow"));
GetItemRequest request = new GetItemRequest()
.withTableName("Music").withKey(key);
// Java Futures
Future<GetItemResult> call = client.getItemAsync(request);
while (!call.isDone()) {
// Do other processing while you're waiting for the response
System.out.println("Doing something else for a few seconds...");
Thread.sleep(3000);
}
// The results should be ready by now
try {
call.get();
} catch (ExecutionException ee) {
// Futures always wrap errors as an ExecutionException.
// The *real* exception is stored as the cause of the
// ExecutionException
Throwable exception = ee.getCause();
System.out.println("Error getting item: " + exception.getMessage());
}
// Async callbacks
call = client.getItemAsync(request, new AsyncHandler<GetItemRequest, GetItemResult>() {
@Override
public void onSuccess(GetItemRequest request, GetItemResult getItemResult) {
System.out.println("Result: " + getItemResult);
}
@Override
public void onError(Exception e) {
System.out.println("Unable to read item");
System.err.println(e.getMessage());
// Callers can also test if exception is an instance of
// AmazonServiceException or AmazonClientException and cast
// it to get additional information
}
});
call.get();
}
}