Data API タイムアウト動作の制御
Data API へのすべての呼び出しは同期的です。INSERT
または CREATE TABLE
などの SQL ステートメントを実行する Data API 操作を実行するとします。Data API 呼び出しが正常に返されると、呼び出しが返されたときに SQL 処理は終了します。
デフォルトでは、Data API は操作をキャンセルし、操作が 45 秒以内に処理を完了しなかった場合、タイムアウトエラーを返します。その場合、データは挿入されず、テーブルは作成されません。
Data API を使用して、45 秒以内に完了できない長時間実行操作を実行できます。大きなテーブルに対する一括操作 INSERT
や DDL 操作などの操作に 45 秒以上かかることが予想される場合は、ExecuteStatement
操作の continueAfterTimeout
パラメータを指定できます。アプリケーションは引き続きタイムアウトエラーを受け取ります。ただし、オペレーションは実行され続け、キャンセルされません。例については、SQL トランザクションの実行を参照してください。
プログラミング言語の AWS SDK に API コールまたは HTTP ソケット接続について独自のタイムアウト期間がある場合、そのようなタイムアウト期間がすべて 45 秒以上であることを確認してください。一部の SDK では、タイムアウト期間はデフォルトで 45 秒未満です。SDK 固有またはクライアント固有のタイムアウト期間を少なくとも 1 分に設定することをお勧めします。これにより、アプリケーションがタイムアウトエラーを受け取る可能性を回避しつつ、Data API 操作を正常に完了できます。これにより、操作を再試行するかどうかを確認できます。
例えば、SDK がタイムアウトエラーをアプリケーションに返したが、Data API 操作は Data API タイムアウト間隔内に完了したとします。その場合、操作を再試行すると、重複したデータが挿入されたり、誤った結果が生成される可能性があります。SDK は操作を自動的に再試行して、アプリケーションからのアクションなしで誤ったデータを引き起こす可能性があります。
Java 2 SDK では、タイムアウト間隔が特に重要です。その SDK では、API コールのタイムアウトと HTTP ソケットのタイムアウトはどちらもデフォルトで 30 秒です。これらのタイムアウトをより高い値に設定する例を次に示します。
public RdsDataClient createRdsDataClient() { return RdsDataClient.builder() .region(Region.US_EAST_1) // Change this to your desired Region .overrideConfiguration(createOverrideConfiguration()) .httpClientBuilder(createHttpClientBuilder()) .credentialsProvider(defaultCredentialsProvider()) // Change this to your desired credentials provider .build(); } private static ClientOverrideConfiguration createOverrideConfiguration() { return ClientOverrideConfiguration.builder() .apiCallTimeout(Duration.ofSeconds(60)) .build(); } private HttpClientBuilder createHttpClientBuilder() { return ApacheHttpClient.builder() // Change this to your desired HttpClient .socketTimeout(Duration.ofSeconds(60)); }
非同期データクライアントを使用した同等の例を次に示します。
public static RdsDataAsyncClient createRdsDataAsyncClient() { return RdsDataAsyncClient.builder() .region(Region.US_EAST_1) // Change this to your desired Region .overrideConfiguration(createOverrideConfiguration()) .credentialsProvider(defaultCredentialsProvider()) // Change this to your desired credentials provider .build(); } private static ClientOverrideConfiguration createOverrideConfiguration() { return ClientOverrideConfiguration.builder() .apiCallAttemptTimeout(Duration.ofSeconds(60)) .build(); } private HttpClientBuilder createHttpClientBuilder() { return NettyNioAsyncHttpClient.builder() // Change this to your desired AsyncHttpClient .readTimeout(Duration.ofSeconds(60)); }