QueryTimeout konfigurieren
Sie können ein Abfragezeitlimit (QueryTimeout) für die Datenquelle einer Anwendung konfigurieren, damit die SQL-Anweisung (Structured Query Language) unterbrochen wird, falls sie nicht vor Ablauf der angegebenen Anzahl Sekunden abgeschlossen werden kann.
Vorbereitende Schritte
Informationen zu diesem Vorgang
- webSphereDefaultQueryTimeout legt ein Standardabfragezeitlimit fest, d. h. die Anzahl der Sekunden, die eine SQL-Anweisung ausgeführt werden kann, bevor sie das zulässige Zeitlimit überschreitet. Dieser Standardwert wird während einer JTA-Transaktion (Java™ Transaction API) überschrieben, wenn die angepasste Eigenschaft syncQueryTimeoutWithTransactionTimeout aktiviert wird.
- syncQueryTimeoutWithTransactionTimeout verwendet die verbleibende Zeit (sofern vorhanden) in einer Transaktion als Standardabfragezeitlimit für SQL-Anweisungen.
- als die Zeit, die basierend auf der Zeitlimiteinstellung des Transaktionsmanagers in der aktuellen JTA-Transaktion übrig bleibt: syncQueryTimeoutWithTransactionTimeout,
- Absolute Anzahhl an Sekunden gemäß Angabe in der Konfiguration - webSphereDefaultQueryTimeout
Vorgehensweise
Ergebnisse
Beispiel
statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // Abfragezeitlimit von 20 Sekunden
statement.executeUpdate(sqlcommand2); // Abfragezeitlimit von 20 Sekunden
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
statement.executeUpdate(sqlcommand3); // Abfragezeitlimit von 30 Sekunden
// Angenommen, die vorherige Operation dauert 5 Sekunden, dann ist die
// verbleibende Zeit 30 - 5 Sekunden
statement.executeUpdate(sqlcommand4); // Abfragezeitlimit von 25 Sekunden
// Angenommen, die vorherige Operation dauert 10 Sekunden, dann ist die
// verbleibende Zeit 25 - 10 Sekunden
statement.executeUpdate(sqlcommand5); // Abfragezeitlimit von 15 Sekunden
}
finally
{
transaction.commit();
}
statement.executeUpdate(sqlcommand6); // Abfragezeitlimit von 20 Sekunden
Im folgenden Beispiel sind die Auswirkungen dargestellt, die sich aufgrund der Einstellung der angepassten Datenquelleneigenschaften
webSphereDefaultQueryTimeout
= 20 und syncQueryTimeoutWithTransactionTimeout =
false ergeben. Wenn nur webSphereDefaultQueryTimeout definiert ist,
wird das Standardzeitlimit für alle Anweisungen verwendet, unabhängig davon, ob diese innerhalb einer JTA-Transaktion ausgeführt werden oder nicht:
statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // Abfragezeitlimit von 20 Sekunden
statement.executeUpdate(sqlcommand2); // Abfragezeitlimit von 20 Sekunden
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
statement.executeUpdate(sqlcommand3); // Abfragezeitlimit von 20 Sekunden
// Angenommen, die vorherige Operation dauert 5 Sekunden
statement.executeUpdate(sqlcommand4); // Abfragezeitlimit von 20 Sekunden
// Angenommen, die vorherige Operation dauert 10 Sekunden
statement.executeUpdate(sqlcommand5); // query timeout of 20 seconds is used
}
finally
{
transaction.commit();
}
statement.executeUpdate(sqlcommand6); // Abfragezeitlimit von 20 Sekunden
Sie können das Abfragezeitlimit für eine Anweisung jederzeit überschreiben, indem Sie die Schnittstelle
java.sql.Statement.setQueryTimeout in Ihrem Anwendungscode aufrufen.