Présentation des propriétés de délai d’attente dans le pilote JDBC
Les paramètres de délai d’attente dans le pilote JDBC peuvent être utilisés pour hiérarchiser la réactivité des applications. Par défaut, la plupart des délais d’attente du pilote donnent la priorité à l’attente d’un résultat pour garantir la cohérence des données. Veillez à choisir des délais d’attente adaptés aux besoins de votre application.
Pour la connexion initiale, loginTimeout
est utilisé :
loginTimeout
est la durée pendant laquelle, en secondes, le pilote attend pour établir une connexion au serveur. Si la durée est dépassée, une erreur est retournée et aucune connexion ouverte n’est établie. La valeur zéro indique que le délai d’attente correspond au délai d’attente système par défaut, lequel est de 30 secondes dans les versions 11.2 et ultérieures. Pour les versions 10.2 et antérieures, le délai d’attente par défaut est de 15 secondes. Toute valeur différente de zéro correspond au nombre de secondes que le pilote doit attendre avant l’expiration d’une connexion échouée. Si vous rencontrez systématiquement des difficultés pour établir une connexion avec le pilote JDBC, vous devrez peut-être porter ce délai d’attente à 90, voire 120 secondes.
Une fois la connexion établie, queryTimeout
, cancelQueryTimeout
et lockTimeout
sont utilisés lors des exécutions d’instructions. socketTimeout
est utilisé pour toute communication du pilote avec le serveur.
queryTimeout
est la durée, en secondes, pendant laquelle le pilote attend, après avoir envoyé une commande d’exécution au serveur, que celui-ci lui retourne une réponse avec des données. Si ce délai est dépassé, la commande est annulée. Le dépassement de ce délai d’attente ne ferme pas la connexion. La valeur -1 par défaut signifie un délai infini.cancelQueryTimeout
est la durée, en secondes, pendant laquelle le pilote attend un accusé de réception de l’annulation dequeryTimeout
du serveur, avant de mettre fin à la connexion ou de la fermer de force. Autrement dit, le pilote attend pendant la durée totale decancelQueryTimeout
plusqueryTimeout
secondes avant que la connexion soit fermée. Le fait de définir ce délai d’attente sur une valeur différente de zéro garantit que les applications peuvent rester réactives en cas de défaillance du réseau ou de la communication avec le serveur, quand une requête est arrivée à expiration. La valeur par défaut de cette propriété est -1, soit un temps d’attente infini.lockTimeout
est le délai d’attente avant qu’un verrou soit libéré, dans les cas où un verrou bloque l’exécution d’une instruction. Le dépassement de ce délai d’attente n’entraîne pas de fermeture de connexion. La valeur par défaut de cette propriété est -1, soit un temps d’attente infini.socketTimeout
s’applique à toutes les communications de socket avec le serveur. Si le serveur arrête la communication avec le pilote, soit en n’accusant pas réception des données, soit en n’y répondant pas, le pilote attend pendant la durée exprimée parsocketTimeout
avant de fermer la connexion. La définition de ce délai d’attente sur une valeur différente de zéro garantit que les applications peuvent rester réactives en cas de défaillance du réseau ou de la communication avec le serveur. La valeur 0 par défaut signifie un délai infini. Assurez-vous quesocketTimeout
est supérieur àqueryTimeout
afin d’éviter les exceptions de délai d’expiration du socket pendant la fenêtrequeryTimeout
. De même, assurez-vous quesocketTimeout
est supérieur àcancelQueryTimeout
afin d’éviter les exceptions de délai d’expiration du socket pendant la fenêtrecancelQueryTimeout
.
Les valeurs de délai d’attente raisonnables pour votre application dépendent des priorités de celle-ci. La définition de valeurs inférieures pour les délais d’attente donne la priorité à la réactivité des applications par rapport à la cohérence des données. Quand les délais d’attente sont atteints, les applications doivent décider du meilleur plan d’action. Cette décision est basée sur l’action de base de données en cours d’exécution. Par exemple, pour une instruction SELECT
, la décision peut être de signaler une erreur à l’utilisateur ou de se reconnecter et de réessayer. Pour les instructions INSERT
ou UPDATE
, cette décision peut être différente.
Pour une application réactive, loginTimeout
et queryTimeout
doit être défini sur des valeurs relativement faibles. De même, cancelQueryTimeout
doit également être défini sur une valeur faible pour garantir que le pilote n’attend pas trop longtemps que le serveur accuse réception de l’annulation de la requête, quand un queryTimeout
est dépassé. Enfin, socketTimeout
doit être défini pour éviter que le pilote n’attende trop longtemps dans tout scénario où la connectivité au serveur est interrompue (interruption réseau, plantage du serveur, etc.).
Récapitulatif des propriétés
Propriété | Description | Default | Résultat pour la connexion |
---|---|---|---|
loginTimeout |
Nombre de secondes que le pilote doit attendre avant l'expiration d'une connexion qui a échoué. | 30 secondes [11.2+], sinon 15 secondes |
Fermeture de la connexion |
queryTimeout |
Nombre de secondes à attendre avant d’annuler une requête. | -1 [Délai d’attente infini] | Ouverture de la connexion |
cancelQueryTimeout |
Nombre de secondes à attendre pour un accusé de réception de l’annulation de QueryTimeout. | -1 [Délai d’attente infini] | Fermeture de la connexion |
lockTimeout |
Nombre de millisecondes à attendre avant que la base de données ne retourne une erreur d’expiration d’un délai de verrouillage. | -1 [Délai d’attente infini] | Ouverture de la connexion |
socketTimeout |
Nombre de millisecondes à attendre lors de la lecture ou de l’écriture d’un socket. | Zéro [délai d’attente infini] | Fermeture de la connexion |