Configuración de QueryTimeout

Puede configurar un tiempo de espera de consulta en el origen de datos de una aplicación de forma que una sentencia de un lenguaje de consulta estructurado (SQL) se interrumpa si no puede completar la ejecución antes del número de segundos que se ha especificado.

Antes de empezar

La API de Java Database Connectivity (JDBC) proporciona una interfaz estándar java.sql.Statement.setQueryTimeout para limitar el número de segundos que un controlador JDBC espera a que se ejecute una sentencia. Una aplicación puede utilizar esto para controlar la cantidad máxima de tiempo que espera la aplicación a que se complete una sentencia SQL antes de que se interrumpa la solicitud. WebSphere Application Server permite que se establezca un tiempo de espera de consulta en un origen de datos, evitando tener que efectuar cambios en la aplicación para llamar a java.sql.Statement.setQueryTimeout directamente. También puede establecer programáticamente un tiempo de espera de consulta SQL en la aplicación invocando a la interfaz java.sql.Statement.setQueryTimeout en cada sentencia.

Acerca de esta tarea

Puede configurar este tiempo de espera de consulta utilizando una de las siguientes propiedades personalizadas :
  1. webSphereDefaultQueryTimeout establece un tiempo de espera de consulta predeterminado, que es el número de segundos que una sentencia SQL puede ejecutarse antes de que se agote el tiempo de espera. Este valor predeterminado se altera temporalmente durante una transacción JTA (Java™ Transaction API) si la propiedad personalizada syncQueryTimeoutWithTransactionTimeout está habilitada.
  2. syncQueryTimeoutWithTransactionTimeout utiliza el tiempo restante (si existe) en una transacción JTA como el tiempo de espera de consulta predeterminado para las sentencias SQL.
De forma predeterminada, el tiempo de espera de la consulta está inhabilitado. Basándose en la presencia y el valor de las dos propiedades personalizadas del origen de datos, se calcula un valor de tiempo de espera de la siguiente manera:
  • el tiempo restante en la transacción JTA actual basado en el valor de tiempo de espera (TM), syncQueryTimeoutWithTransactionTimeout
  • el número absoluto de segundos especificado por la configuración, webSphereDefaultQueryTimeout
A continuación, el tiempo de espera calculado se establece como un valor de tiempo de espera de consulta en cada sentencia SQL ejecutada por la aplicación que utiliza el origen de datos configurado.

Procedimiento

  1. Abra la consola administrativa.
  2. Vaya al panel Propiedades del origen de datos de WebSphere Application Server para el origen de datos.
    1. Pulse Recursos > JDBC > Orígenes de datos > origen_datos
    2. Pulse Propiedades del origen de datos de WebSphere Application Server.
  3. Pulse Propiedades personalizadas en Propiedades adicionales.
  4. Pulse Nuevo.
  5. Escriba webSphereDefaultQueryTimeout en el campo Nombre.
  6. Especifique el número de segundos para utilizar para el tiempo de espera de consulta predeterminado en el campo Valor. El valor de tiempo de espera se especifica en segundos. Un valor de 0 (cero) indica que no hay tiempo de espera.
  7. Pulse OK (Aceptar).
  8. Pulse Nuevo.
  9. Escriba syncQueryTimeoutWithTransactionTimeout en el campo Nombre.
  10. Especifique true o false en el campo Valor. Un valor de true indica utilizar el tiempo restante en una transacción JTA como el tiempo de espera de consulta predeterminado.
  11. Pulse OK (Aceptar).
  12. Guarde los cambios. Las actualizaciones entran en vigor después de que se reinicie el servidor.

Resultados

Ha configurado el tiempo de espera de la consulta en el origen de datos de la aplicación.

Ejemplo

El ejemplo siguiente muestra el efecto de establecer las propiedades personalizadas del origen de datos webSphereDefaultQueryTimeout = 20 y syncQueryTimeoutWithTransactionTimeout = true. Tenga en cuenta que puesto que se establecen las dos propiedades, las sentencias SQL ejecutadas fueran de una transacción JTA (desmarcadas por las llamadas a transaction.begin() y transaction.commit()) utilizan el valor de tiempo de espera predeterminado establecido por webSphereDefaultQueryTimeout. Aquellas dentro de la transacción JTA utilizan el tiempo restante antes de que expire el tiempo de espera de la transacción:
statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // se utiliza un tiempo de espera de consulta de 20 segundos
statement.executeUpdate(sqlcommand2); // se utiliza un tiempo de espera de consulta de 20 segundos
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
    statement.executeUpdate(sqlcommand3); // se utiliza un tiempo de espera de consulta de 30 segundos
    // se supone que la operación anterior tardó 5 segundos, tiempo restante = 30 - 5 segundos
    statement.executeUpdate(sqlcommand4); // se utiliza un tiempo de espera de consulta de 25 segundos
    // se supone que la operación anterior tardó 10 segundos, , tiempo restante = 25 - 10 segundos
    statement.executeUpdate(sqlcommand5); // se utiliza un tiempo de espera de consulta de 15 segundos
}
finally
{
    transaction.commit();
}
statement.executeUpdate(sqlcommand6); // se utiliza un tiempo de espera de consulta de 20 segundos 
El ejemplo siguiente muestra el efecto de establecer las propiedades personalizadas del origen de datos webSphereDefaultQueryTimeout = 20 y syncQueryTimeoutWithTransactionTimeout = false. Cuando solo se establece webSphereDefaultQueryTimeout, el valor de tiempo de espera predeterminado se utiliza para todas las sentencias, independientemente de si se ejecutan dentro de la transacción JTA o no:
statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // se utiliza un tiempo de espera de consulta de 20 segundos
statement.executeUpdate(sqlcommand2); // se utiliza un tiempo de espera de consulta de 20 segundos
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
    statement.executeUpdate(sqlcommand3); // se utiliza un tiempo de espera de consulta de 20 segundos
    // se supone que la operación anterior tardó 5 segundos
    statement.executeUpdate(sqlcommand4); // se utiliza un tiempo de espera de consulta de 20 segundos
    // se supone que la operación anterior tardó 10 segundos
    statement.executeUpdate(sqlcommand5); // se utiliza un tiempo de espera de consulta de 20 segundos
}
finally
{
    transaction.commit();
}
statement.executeUpdate(sqlcommand6); // se utiliza un tiempo de espera de consulta de 20 segundos 
Puede alterar temporalmente el tiempo de espera de consulta para una sentencia en cualquier momento invocando la interfaz java.sql.Statement.setQueryTimeout desde el código de la aplicación.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdat_querytimeout
File name: tdat_querytimeout.html