

# 控制数据 API 超时行为
<a name="data-api-timeouts"></a>

 对 Data API 的所有调用都是同步的。假设您执行了一个数据 API 操作，该操作运行 SQL 语句，例如 `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 SDK 对 API 调用或 HTTP 套接字连接有自己的超时时间，请确保所有这些超时时间都超过 45 秒。对于某些 SDK，超时时间默认为小于 45 秒。我们建议将任何特定于 SDK 或特定于客户端的超时时间设置为至少 1 分钟。采用这种方法，您可以避免虽然数据 API 操作成功完成，但应用程序仍可能收到超时错误。这样您就可以确定是否要重试操作。

 例如，假设 SDK 向您的应用程序返回超时错误，但是数据 API 操作仍在数据 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));
}
```