Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Quando chamo PreparedStatement.cancel() em um aplicativo JDBC, ele realmente o elimina em um banco de dados Oracle?


Observe que o que digo abaixo é baseado em observações e inferências do Oracle em uso e não em nenhum entendimento profundo dos componentes internos do Oracle. Nada disso deve ser considerado autoritário.

O que a Ninesided disse em seu primeiro parágrafo está correto. No entanto, cuidado com o teste sugerido. Nem todas as consultas oracle de longa duração são iguais. Parece que as consultas são avaliadas em duas fases, primeiro uma fase que combina dados suficientes para saber como retornar as linhas na ordem correta e a segunda uma fase que retorna as linhas preenchendo as lacunas que não foram computadas no primeira fase. A divisão do trabalho entre as duas fases também é afetada pelas configurações do otimizador baseado em custo. por exemplo. Primeiras linhas vs Todas as linhas.

Agora, se a consulta estiver na fase 1, a solicitação de cancelamento parece, na melhor das hipóteses, estar enfileirada para ser aplicada no final da fase 1, o que significa que a consulta continua operando.

Na fase 2, as linhas são retornadas em grupos e, após cada grupo, o comando de cancelamento pode entrar em vigor, portanto, supondo que o driver suporte o comando, a solicitação de cancelamento resultará na eliminação da consulta.

A especificação para o comando de cancelamento do JDBC não parece dizer o que deve acontecer se a consulta não parar de ser executada e, portanto, o comando pode aguardar a confirmação do kill ou pode atingir o tempo limite e retornar com a consulta ainda em execução.