

# 既存の SDK for Java 1.x アプリケーションを DAX を使用するように変更する
<a name="DAX.client.modify-your-app.java-sdk-v1"></a>

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 を使用するように変更する](DAX.client.modify-your-app.md)」を参照してください。

`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 を使用する
<a name="DAX.client.modify-your-app.document-api"></a>

AWS SDK for Java は DynamoDB 向けのドキュメントインターフェイスを提供します。ドキュメント API は、低レベル DynamoDB クライアントのラッパーとして機能します。詳細については、「[ドキュメントインターフェイス](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.SDKs.Interfaces.Document.html)」を参照してください。

ドキュメントインターフェイスは、次の例に示すように、低レベル 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 非同期クライアント
<a name="DAX.client.async"></a>

`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();

	}
}
```