Estou usando o Oracle10g e estou com um problema que está me desafiando. O aplicativo tem um tempo limite de 45 segundos. Ele acessa um usuário do meu banco de dados e sempre executa a mesma ação. O problema é que o aplicativo quando uma sessão termina por timeout, termina apenas no nível do aplicativo e não no banco de dados.
Isso faz com que o banco de dados continue processando e execute a ação com sucesso, porém o aplicativo executa outra chamada causando duplicação de dados. (Uma chave primária é determinada pela sequência)
Qual é a minha ideia? Encerre a sessão quando a execução de determinada instrução exceder 45 segundos no banco de dados, desse usuário específico. O problema é que o aplicativo usa um pool de conexão, e o aplicativo trata quem entra ou não no banco de dados.
Não consigo implementar por perfil, pois as ligações ficam na bancada por dias, e somente quando necessário para fazer o agendamento.
Eu preciso saber quanto tempo está levando uma determinada consulta para executar. Minha necessidade é saber quando um usuário, ele só faz uma única consulta no banco de dados, ele atinge o tempo limite da aplicação, que é de 45 segundos.
Onde posso obter esta informação? Com ela eu poderia determinar qual sessão fechou, já que um perfil seria inviável.
Peço desculpas pelo meu inglês ruim. Eu ainda estou aprendendo.
Felicidades Rainier Morilla
Parece que a transação está sendo confirmada (talvez automaticamente) mesmo quando o aplicativo atinge o tempo limite. Mudar o
COMMIT
comportamento seria a melhor opção.Se você não puder fazer isso, poderá colocar a ação do banco de dados em um pacote e fazer com que o pacote verifique depois de executar a ação para ver quanto tempo se passou. Se o passo levar mais de 45 segundos, então deveria
ROLLBACK
, caso contrárioCOMMIT
.Embora isso responda à sua pergunta, é uma solução frágil e você realmente deve procurar alterar o
COMMIT
comportamento ou causar uma desconexão do banco de dados quando ocorrer um tempo limite.