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
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'attente de requête sur une source de données, ce qui évite d'avoir à apporter des modifications à l'application pour appeler java.sql.Statement.setQueryTimeout directement. 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.A propos de cette tâche
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. Cette valeur par défaut est remplacée lors d'une transaction JTA (Java™ Transaction API) si la propriété personnaliséesyncQueryTimeoutWithTransactionTimeoutest activée.syncQueryTimeoutWithTransactionTimeoututilise 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.
- 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
Procédure
- Ouvrez la console d'administration.
- Cliquez sur
- Cliquez sur Propriétés personnalisées sous Propriétés supplémentaires.
- Cliquez sur Nouveau.
- Entrez
webSphereDefaultQueryTimeoutdans la zone Nom . - Entrez le nombre de secondes à utiliser pour le délai d'attente de requête 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.
- Cliquez sur OK.
- Cliquez sur Nouveau.
- Entrez
syncQueryTimeoutWithTransactionTimeoutdans la zone Nom . - 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.
- Cliquez sur OK.
- Enregistrez vos modifications.Les mises à jour prennent effet une fois le serveur redémarré.
Résultats
Exemple
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 identifiée 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 preceding operation took 5 seconds, remaining time = 30 - 5 seconds
statement.executeUpdate(sqlcommand4); // query timeout of 25 seconds is used
// assume the preceding 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 usedL'exemple suivant 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 preceding operation took 5 seconds
statement.executeUpdate(sqlcommand4); // query timeout of 20 seconds is used
// assume the preceding 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 usedVous 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.