sql >> Base de Datos >  >> RDS >> Oracle

Cuando llamo a PreparedStatement.cancel() en una aplicación JDBC, ¿realmente lo mata en una base de datos Oracle?

Tenga en cuenta que lo que digo a continuación se basa en observaciones e inferencias de Oracle en uso, y no se basa en una comprensión profunda de las funciones internas de Oracle. Nada de esto debe considerarse autoritativo.

Lo que dijo ninesided en su primer párrafo es correcto. Sin embargo, tenga cuidado con la prueba sugerida. No todas las consultas de Oracle de larga duración son iguales. Parece que las consultas se evalúan en dos fases, primero una fase que combina datos suficientes para saber cómo devolver las filas en el orden correcto, y segundo una fase que devuelve las filas llenando los espacios que no calculó en el primera fase. La división del trabajo entre las dos fases también se ve afectada por la configuración del optimizador basado en costos. p.ej. Primeras filas frente a todas las filas.

Ahora, si la consulta está en la fase 1, la solicitud de cancelación parece estar en cola para aplicarse al final de la fase 1, lo que significa que la consulta continúa funcionando.

En la fase 2, las filas se devuelven en grupos y, después de cada grupo, el comando de cancelación puede surtir efecto, por lo que, suponiendo que el controlador admita el comando, la solicitud de cancelación dará como resultado la eliminación de la consulta.

La especificación para el comando de cancelación de JDBC no parece decir lo que debería suceder si la consulta no deja de ejecutarse y, por lo tanto, el comando puede esperar la confirmación de la eliminación o puede agotarse el tiempo de espera y regresar con la consulta aún en ejecución.