Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Contrôle du comportement d'expiration de l'API de données
Tous les appels à l'API de données sont synchrones. Supposons que vous exécutiez une opération d'API de données qui exécute une instruction SQL telle que INSERT
ouCREATE TABLE
. Si l'appel de l'API Data est renvoyé avec succès, le traitement SQL est terminé lorsque l'appel revient.
Par défaut, l'API Data annule une opération et renvoie une erreur de temporisation si le traitement de l'opération n'est pas terminé dans les 45 secondes. Dans ce cas, les données ne sont pas insérées, la table n'est pas créée, etc.
Vous pouvez utiliser l'API de données pour effectuer des opérations de longue durée qui ne peuvent pas être effectuées en 45 secondes. Si vous pensez qu'une opération, telle qu'une opération en bloc INSERT
ou une opération DDL sur une grande table, dure plus de 45 secondes, vous pouvez spécifier le continueAfterTimeout
paramètre de l'ExecuteStatement
opération. Votre application reçoit toujours le message d'erreur de temporisation. Toutefois, l'opération continue et n'est pas annulée. Pour obtenir un exemple, consultez Exécution d'une transaction SQL.
Si le AWS SDK de votre langage de programmation dispose de son propre délai d'expiration pour les appels d'API ou les connexions au socket HTTP, assurez-vous que tous ces délais sont supérieurs à 45 secondes. Pour certains SDKs, le délai d'expiration est inférieur à 45 secondes par défaut. Nous vous recommandons de définir les délais d'expiration spécifiques au SDK ou au client à au moins une minute. Cela permet d'éviter que votre application reçoive une erreur de temporisation alors que l'opération Data API se termine toujours avec succès. Ainsi, vous pouvez être sûr de recommencer l'opération ou non.
Supposons, par exemple, que le SDK renvoie une erreur de temporisation à votre application, mais que l'opération de l'API de données se termine toujours dans l'intervalle de temporisation de l'API de données. Dans ce cas, une nouvelle tentative d'opération risque d'insérer des données dupliquées ou de produire des résultats incorrects. Le SDK peut réessayer l'opération automatiquement, ce qui entraîne des données incorrectes sans aucune action de la part de votre application.
L'intervalle de temporisation est particulièrement important pour le SDK Java 2. Dans ce SDK, le délai d'expiration des appels d'API et le délai d'expiration du socket HTTP sont tous deux de 30 secondes par défaut. Voici un exemple de définition d'une valeur plus élevée pour ces délais :
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)); }
Voici un exemple équivalent utilisant le client de données asynchrone :
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)); }