Cuando llamo a PrepanetworkingStatement.cancel () en una aplicación JDBC, ¿realmente lo mata en una database Oracle?

Tengo la aplicación Java JDBC ejecutándose en una database Oracle 10g. Configuré un PrepanetworkingStatement para ejecutar una consulta, y luego llamo a ps.executeQuery () para ejecutarlo. Ocasionalmente, la consulta lleva mucho time y necesito matarla. Tengo otro subprocess para acceder al object PrepanetworkingStatement y llamar a cancel () en él.

Mi pregunta es, ¿esto realmente mata la consulta en la database? ¿O simplemente lo separa del cliente, y la consulta todavía se está ejecutando en algún lugar en las entrañas de Oracle?

¡Gracias!

La respuesta es que es un problema de calidad de implementación. Si observa el javadoc para Statement.cancel (), dice que sucederá "si tanto DBMS como el controller admiten abortar una instrucción SQL".

En mi experiencia con varias versiones de controlleres JDBC de Oracle, Statement.cancel () parece hacer lo que desea. La consulta parece dejar de ejecutarse rápidamente cuando se cancela.

Tenga en count 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 partes internas de Oracle. Nada de eso debe considerarse autoritativo.

Lo que dijo ninesided en su primer párrafo es correcto. Sin embargo, ten cuidado con la testing sugerida. No todas las consultas de oracle de larga ejecució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 order correcto y, en segundo lugar, una fase que devuelve las filas llenando las lagunas que no calculó en el primera fase. La split del trabajo entre las dos fases también se ve afectada por la configuration del optimizador basado en el costo. por ejemplo, First-rows vs All-rows.

Ahora, si la consulta está en la fase 1, la request de cancelación parece en el mejor de los casos ser puesta en queue para ser aplicada al final de la fase 1, lo que significa que la consulta continúa operando.

En la fase 2, las filas se devuelven en grupos, y después de cada grupo, el command cancelar puede entrar en vigencia, por lo que, suponiendo que el controller admita el command, la request de cancelación dará como resultado que se elimine la consulta.

La especificación para el command cancelar JDBC no parece decir qué sucedería si la consulta no deja de ejecutarse, y por lo tanto, el command puede esperar la confirmación del cierre, o puede agotar el time de espera y regresar con la consulta aún ejecutándose.

Depende del controller que esté utilizando, tanto el controller como la database deben admitir la cancelación de una statement para que funcione como usted desee. Oracle admite esta característica, pero necesita saber más sobre el controller específico que está utilizando para estar seguro.

Alternativamente, podría ejecutar una testing simple mirando la database después de iniciar y cancelar una consulta de larga ejecución.