

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 控制資料 API 逾時行為
<a name="data-api-timeouts"></a>

 對資料 API 的所有呼叫都是同步。假設您執行的是執行 SQL 陳述式的資料 API 操作，例如 `INSERT` 或 `CREATE TABLE`。如果資料 API 呼叫成功傳回，則 SQL 處理會在呼叫傳回時完成。

 根據預設，如果操作未在 45 秒內完成處理，則資料 API 會取消操作並傳回逾時錯誤。在這種情況下，資料不會插入，資料表也不會建立，以此類推。

 您可以使用資料 API，來執行無法在 45 秒內完成的長時間執行操作。如果您預期對大型資料表執行大量 `INSERT` 或 DDL 操作之類的操作需要超過 45 秒，您可以指定 `ExecuteStatement` 操作的 `continueAfterTimeout` 參數。應用程式仍會收到逾時錯誤。不過，操作會繼續執行，不會取消。如需範例，請參閱「[執行 SQL 交易](data-api.calling.java.md#data-api.calling.java.run-transaction)」。

 如果程式設計語言 AWS 開發套件有自己的 API 呼叫或 HTTP 通訊端連線逾時期間，請確定所有這類逾時期間都超過 45 秒。對於某些 SDK，逾時期間預設為少於 45 秒。我們建議將任何 SDK 特定或用戶端特定逾時期間設定為至少一分鐘。這樣做可避免應用程式在資料 API 操作仍然成功完成時收到逾時錯誤的可能性。如此一來，您就可以確定是否要重試操作。

 例如，假設 SDK 將逾時錯誤傳回至應用程式，但資料 API 操作仍在資料 API 逾時間隔內完成。在這種情況下，重試操作可能會插入重複的資料，否則會產生不正確的結果。開發套件可能會自動重試操作，導致資料有誤，而不需要來自應用程式的任何動作。

 逾時間隔對於 Java 2 開發套件特別重要。在該開發套件中，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));
}
```