Configuration de QueryTimeout

Vous pouvez configurer un délai d'expiration de demande sur la source de données d'une application, afin qu'une instruction SQL (Structured Query Language) soit interrompue si elle ne parvient pas à terminer l'exécution avant le nombre indiqué de secondes.

Avant de commencer

L'API JDBC (Java Database Connectivity) offre une interface standard, java.sql.Statement.setQueryTimeout, qui permet de limiter le nombre de secondes d'attente par un pilote JDBC avant l'exécution d'une instruction. Elle est utilisée par une application pour contrôler le délai maximal d'attente par l'application d'exécution d'une instruction SQL avant l'interruption de la demande. WebSphere Application Server permet de définir un délai d'expiration de demande sur une source de données, évitant ainsi d'apporter des modifications d'application pour appeler directement l'interface java.sql.Statement.setQueryTimeout. Vous pouvez néanmoins établir, à l'aide d'un programme, un délai d'expiration de demande SQL dans l'application en appelant l'interface java.sql.Statement.setQueryTimeout sur chaque instruction.

Pourquoi et quand exécuter cette tâche

Vous pouvez configurer ce délai d'expiration de demande en utilisant l'une des deux propriétés personnalisées suivantes :
  1. webSphereDefaultQueryTimeout établit un délai d'expiration de demande par défaut, qui correspond au nombre de secondes durant lesquelles une instruction SQL peut être en cours d'exécution avant l'expiration du délai. La valeur par défaut est remplacée lors d'une transaction JTA (Java™ Transaction API) si la propriété personnalisée syncQueryTimeoutWithTransactionTimeout est activée.
  2. syncQueryTimeoutWithTransactionTimeout utilise le cas échéant le temps restant d'une transaction JTA en tant que délai d'expiration de demande par défaut pour les instructions SQL.
Par défaut, le délai d'expiration des demandes est désactivé. En fonction de la présence et de la valeur des deux propriétés personnalisées de source de données, une valeur de délai d'expiration est calculée sous l'une des formes suivantes :
  • le temps restant dans la transaction JTA en cours en fonction du paramètre de délai d'expiration TM (Transaction Manager) - syncQueryTimeoutWithTransactionTimeout
  • le nombre absolu de secondes défini par la configuration - webSphereDefaultQueryTimeout
Le délai d'expiration calculé est ensuite utilisé pour définir une valeur de délai d'expiration de demande sur chaque instruction SQL exécutée par l'application à l'aide de la source de données configurée.

Procédure

  1. Ouvrez la console d'administration.
  2. Accédez au panneau Propriétés de la source de données WebSphere Application Server de la source de données.
    1. Cliquez sur Ressources > JDBC > Sources de données > source_données
    2. Cliquez sur Propriétés de la source de données WebSphere Application Server.
  3. Cliquez sur Propriétés personnalisées sous Propriétés supplémentaires.
  4. Cliquez sur Nouveau.
  5. Entrez webSphereDefaultQueryTimeout dans la zone Nom.
  6. Entrez le nombre de secondes à utiliser pour le délai d'expiration de demande par défaut dans la zone Valeur. Cette valeur est exprimée en secondes. La valeur 0 (zéro) indique qu'il n'existe pas de délai d'expiration.
  7. Cliquez sur OK.
  8. Cliquez sur Nouveau.
  9. Entrez syncQueryTimeoutWithTransactionTimeout dans la zone Nom.
  10. Entrez true ou false dans la zone Valeur. La valeur true indique d'utiliser le temps restant d'une transaction JTA en tant que délai d'expiration de demande par défaut.
  11. Cliquez sur OK.
  12. Enregistrez les modifications. Les mises à jour prennent effet une fois le serveur redémarré.

Résultats

Vous avez configuré le délai d'expiration de demande sur la source de données de votre application.

Exemple

L'exemple ci-dessous illustre l'impact de la définition des propriétés personnalisées de source de données webSphereDefaultQueryTimeout = 20 et syncQueryTimeoutWithTransactionTimeout = true. Il est à noter que, dans la mesure où les deux propriétés sont définies, les instructions SQL exécutées hors d'une transaction JTA (comme identifé par les appels émis à transaction.begin() and transaction.commit()) utilisent la valeur de délai d'expiration par défaut établie par webSphereDefaultQueryTimeout. Celles figurant dans la transaction JTA utilisent le temps restant avant l'expiration du délai d'expiration de la transaction :
statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // query timeout of 20 seconds is used
statement.executeUpdate(sqlcommand2); // query timeout of 20 seconds is used
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
    statement.executeUpdate(sqlcommand3); // query timeout of 30 seconds is used
    // assume the above operation took 5 seconds, remaining time = 30 - 5 seconds
    statement.executeUpdate(sqlcommand4); // query timeout of 25 seconds is used
    // assume the above operation took 10 seconds, , remaining time = 25 - 10 seconds
    statement.executeUpdate(sqlcommand5); // query timeout of 15 seconds is used
}
finally
{
    transaction.commit();
}
statement.executeUpdate(sqlcommand6); // query timeout of 20 seconds is used
L'exemple ci-dessous illustre l'impact de la définition des propriétés personnalisées de source de données webSphereDefaultQueryTimeout = 20 et syncQueryTimeoutWithTransactionTimeout = false. Lorsque seul webSphereDefaultQueryTimeout est défini, la valeur de délai d'expiration par défaut est utilisée pour toutes les instructions, qu'elles soient exécutées dans une transaction JTA ou non :
statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // query timeout of 20 seconds is used
statement.executeUpdate(sqlcommand2); // query timeout of 20 seconds is used
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
    statement.executeUpdate(sqlcommand3); // query timeout of 20 seconds is used
    // assume the above operation took 5 seconds
    statement.executeUpdate(sqlcommand4); // query timeout of 20 seconds is used
    // assume the above operation took 10 seconds
    statement.executeUpdate(sqlcommand5); // query timeout of 20 seconds is used
}
finally
{
    transaction.commit();
}
statement.executeUpdate(sqlcommand6); // query timeout of 20 seconds is used
Vous pouvez remplacer le délai d'expiration de demande pour une instruction à tout moment en appelant l'interface java.sql.Statement.setQueryTimeout à partir de votre code d'application.

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdat_querytimeout
Nom du fichier : tdat_querytimeout.html