Configurando o QueryTimeout

É possível configurar um tempo limite de consulta na origem de dados de um aplicativo para que a instrução SQL (Structured Query Language) seja interrompida caso ela não conclua a execução antes do número de segundos especificado.

Antes de Iniciar

A API do JDBC (Java Database Connectivity fornece uma interface padrão java.sql.Statement.setQueryTimeout para limitar o número de segundos que um driver JDBC espera para uma instrução ser executada. Isso é usado por um aplicativo para controlar a quantidade máxima de tempo que o aplicativo espera para uma instrução SQL ser concluída antes de a solicitação ser interrompida. O WebSphere Application Server permite um tempo limite de consulta a ser configurado em uma origem de dados, evitando a necessidade de fazer alterações do aplicativo para chamar diretamente o java.sql.Statement.setQueryTimeout. É possível ainda estabelecer de forma programática um tempo limite de consulta SQL no aplicativo chamando a interface do java.sql.Statement.setQueryTimeout em cada instrução.

Sobre Esta Tarefa

É possível configurar este tempo limite de consulta usando uma das seguintes propriedades customizadas:
  1. webSphereDefaultQueryTimeout estabelece um tempo limite de consulta padrão, que é o número de segundos que uma instrução SQL pode executar antes de atingir o tempo limite. Esse valor padrão é substituído durante uma transação Java™ Transaction API (JTA) se a propriedade customizada syncQueryTimeoutWithTransactionTimeout estiver ativada.
  2. syncQueryTimeoutWithTransactionTimeout usa o tempo restante (se houver) em uma transação JTA como o tempo limite de consulta padrão para instruções SQL.
Por padrão, o tempo limite de consulte está desativado. Baseado na presença e valor das duas propriedades customizadas da origem de dados, um valor do tempo limite é calculado como:
  • O tempo restante na transação JTA com base na configuração do tempo limite do TM (Transaction Manager) - syncQueryTimeoutWithTransactionTimeout
  • o número absoluto de segundos especificado pela configuração - webSphereDefaultQueryTimeout
O tempo limite calculado é então utilizado para configurar um valor para o tempo limite de consulta em cada instrução SQL executada pelo aplicativo usando a origem de dados configurada.

Procedimento

  1. Abra o administrative console.
  2. Vá para o painel Propriedades da Origem de Dados do WebSphere Application Server para obter a origem de dados.
    1. Clique em Recursos > JDBC > Origens de Dados > data_source
    2. Clique em Propriedades de Origem de Dados do WebSphere Application Server.
  3. Clique em Propriedades Customizadas em Propriedades Adicionais.
  4. Clique em Nova.
  5. Insira webSphereDefaultQueryTimeout no campo Nome.
  6. Insira o número de segundos a ser usado para o tempo limite de consulta padrão no campo Valor. O valor de tempo limite está em segundos. Um valor de 0 (zero) indica nenhum que não há tempo limite.
  7. Clique em OK.
  8. Clique em Nova.
  9. Insira syncQueryTimeoutWithTransactionTimeout no campo Nome.
  10. Insira true ou false no campo Valor. Um valor true indica para usar o tempo restante em uma transação JTA como o tempo limite de consulta padrão.
  11. Clique em OK.
  12. Salve as mudanças. As atualizações entram em vigor depois que o servidor é reiniciado.

Resultados

Você configurou o tempo limite de consulta na origem de dados de seu aplicativo.

Exemplo

O exemplo a seguir ilustra o efeito da configuração das propriedades customizadas da origem de dados webSphereDefaultQueryTimeout = 20 e syncQueryTimeoutWithTransactionTimeout = true. Note como ambas as propriedades são configuradas, as instruções SQL executadas fora de uma transação JTA (conforme demarcadas pelas chamadas para transaction.begin() e transaction.commit()) usam o valor de tempo limite padrão estabelecido pelo webSphereDefaultQueryTimeout. Aquelas dentro da transação JTA usam o tempo restante antes da expiração do tempo limite da transação:
statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // o tempo limite de consulta de 20 segundos é usado
statement.executeUpdate(sqlcommand2); // o tempo limite de consulta de 20 segundos é usado
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
    statement.executeUpdate(sqlcommand3); // o tempo limite de consulta de 30 segundos é usado
    // suponha que a operação acima levou 5 segundos, tempo restante = 30 - 5 segundos
    statement.executeUpdate(sqlcommand4); // o tempo limite de consulta de 25 segundos é usado
    // suponha que a operação acima levou 10 segundos, tempo restante = 25 - 10 segundos
    statement.executeUpdate(sqlcommand5); // o tempo limite de consulta de 15 segundos é usado
}
finally
{
    transaction.commit();
}
statement.executeUpdate(sqlcommand6); // o tempo limite de consulta de 20 segundos é usado
O exemplo a seguir ilustra o efeito da configuração das propriedades customizadas da origem de dados webSphereDefaultQueryTimeout = 20 e syncQueryTimeoutWithTransactionTimeout = false. Quando somente webSphereDefaultQueryTimeout é configurado, o valor de tempo limite padrão é usado para todas as instruções, independentemente de serem executadas ou não dentro de uma transação a JTA:
statement = connection.createStatement();
statement.executeUpdate(sqlcommand1); // o tempo limite de consulta de 20 segundos é usado
statement.executeUpdate(sqlcommand2); // o tempo limite de consulta de 20 segundos é usado
transaction.setTransactionTimeout(30);
transaction.begin();
try
{
    statement.executeUpdate(sqlcommand3); // o tempo limite de consulta de 20 segundos é usado
    // suponha que a operação acima levou 5 segundos
    statement.executeUpdate(sqlcommand4); // o tempo limite de consulta de 20 segundos é usado
    // suponha que a operação acima levou 10 segundos
    statement.executeUpdate(sqlcommand5); // o tempo limite de consulta de 20 segundos é usado
}
finally
{
    transaction.commit();
}
statement.executeUpdate(sqlcommand6); // o tempo limite de consulta de 20 segundos é usado
É possível substituir o tempo limite de consulta para uma instrução a qualquer momento, chamando a interface java.sql.Statement.setQueryTimeout a partir de seu código do aplicativo.

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdat_querytimeout
Nome do arquivo: tdat_querytimeout.html