控制数据 API 超时行为 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

控制数据 API 超时行为

对 Data API 的所有调用都是同步的。假设您执行了一个数据 API 操作,该操作运行 SQL 语句,例如 INSERTCREATE TABLE。如果数据 API 调用成功返回,则当调用返回时,SQL 处理即告完成。

默认情况下,如果操作未在 45 秒内完成处理,则数据 API 会取消该操作并返回超时错误。在这种情况下不会插入数据,也不会创建表,依此类推。

您可以使用数据 API 执行无法在 45 秒内完成的长时间运行的操作。如果您预计对大型表执行的操作(如批量 INSERT 或 DDL 操作)所花费的时间超过 45 秒,则可以为 ExecuteStatement 操作指定 continueAfterTimeout 参数。您的应用程序仍会收到超时错误。但是,操作会继续运行而不会被取消。有关示例,请参阅运行 SQL 事务

如果在您使用的编程语言中,Amazon 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)); }