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

Die JDBC-API (Java Database Connectivity) stellt die Standardschnittstelle java.sql.Statement.setQueryTimeout bereit, um die Anzahl der Sekunden, während der ein JDBC-Treiber auf die Ausführung einer Anwendung wartet, zu begrenzen. Damit steuert eine Anwendung die Höchstdauer, während der eine Anwendung auf die Ausführung einer SQL-Anwendung wartet und nach deren Ablauf die Anforderung unterbrochen wird. In WebSphere Application Server kann ein Abfragezeitlimit für eine Datenquelle festgelegt werden, ohne dass eine Anwendung die Schnittstelle java.sql.Statement.setQueryTimeout direkt aufrufen muss. Sie können ein SQL-Abfragezeitlimit weiterhin programmgesteuert in der Anwendung festlegen, indem Sie die Schnittstelle java.sql.Statement.setQueryTimeout für jede Anweisung aufrufen.

Informationen zu diesem Vorgang

Das Abfragezeitlimit kann mit einer der folgenden angepassten Eigenschaften konfiguriert werden:
  1. 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.
  2. syncQueryTimeoutWithTransactionTimeout verwendet die verbleibende Zeit (sofern vorhanden) in einer Transaktion als Standardabfragezeitlimit für SQL-Anweisungen.
Standardmäßig ist das Abfragezeitlimit inaktiviert. Abhängig davon, ob und mit welchem Wert die beiden angepassten Eigenschaften definiert sind, wird der Zeitlimitwert wie folgt berechnet:
  • 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
Das berechnete Zeitlimit wird dann verwendet, um über die konfigurierte Datenquelle für jede von der Anwendung ausgeführte SQL-Anweisung einen Zeitlimitwert festzulegen.

Vorgehensweise

  1. Öffnen Sie die Administrationskonsole.
  2. Rufen Sie die Anzeige Eigenschaften der WebSphere-Datenquelle für die Datenquelle auf.
    1. Klicken Sie auf Ressourcen > JDBC > Datenquellen > Datenquelle.
    2. Klicken Sie auf Eigenschaften für WebSphere-Datenquelle.
  3. Klicken Sie unter "Weitere Eigenschaften" auf Angepasste Eigenschaften.
  4. Klicken Sie auf Neu.
  5. Geben Sie webSphereDefaultQueryTimeout im Feld Name ein.
  6. Geben Sie die für das Standardabfragezeitlimit zu verwendende Anzahl an Sekunden im Feld Wert ein. Das Zeitlimit wird in Sekunden angegeben. Der Wert 0 (null) zeigt an, dass kein Zeitlimit existiert.
  7. Klicken Sie auf OK.
  8. Klicken Sie auf Neu.
  9. Geben Sie syncQueryTimeoutWithTransactionTimeout im Feld Name ein.
  10. Geben Sie true oder false im Feld Wert ein. Der Wert true zeigt an, dass die verbleibende Zeit in einer JTA-Transaktion als Standardabfragezeitlimit verwendet werden soll.
  11. Klicken Sie auf OK.
  12. Speichern Sie Ihre Änderungen. Die Aktualisierungen werden nach dem Neustart des Servers wirksam.

Ergebnisse

Sie haben das Abfragezeitlimit in der Datenquelle Ihrer Anwendung konfiguriert.

Beispiel

Im folgenden Beispiel sind die Auswirkungen dargestellt, die sich aufgrund der Einstellung der angepassten Datenquelleneigenschaften webSphereDefaultQueryTimeout = 20 und syncQueryTimeoutWithTransactionTimeout = true ergeben. Weil beide Eigenschaften festgelegt sind, verwenden die SQL-Anweisungen, die außerhalb einer JTA-Transaktion ausgeführt werden (diese wird durch die Aufrufe transaction.begin() und transaction.commit() begrenzt), das mit der Eigenschaft webSphereDefaultQueryTimeout definierte Standardabfragezeitlimit. Anweisungen innerhalb der JTA-Transaktion verwenden die verbleibende Zeit vor Ablauf des Transaktionszeitlimits:
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.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdat_querytimeout
Dateiname:tdat_querytimeout.html