Oracle
 sql >> Base de données >  >> RDS >> Oracle

Lorsque j'appelle PreparedStatement.cancel() dans une application JDBC, le tue-t-il réellement dans une base de données Oracle ?

Veuillez noter que ce que je dis ci-dessous est basé sur des observations et des inférences d'Oracle en cours d'utilisation, et n'est pas basé sur une compréhension approfondie des composants internes d'Oracle. Rien de tout cela ne doit être considéré comme faisant autorité.

Ce que neuf côtés a dit dans leur premier paragraphe est correct. Attention cependant au test proposé. Toutes les requêtes oracle de longue durée ne sont pas identiques. Il semble que les requêtes soient évaluées en deux phases, d'abord une phase qui combine suffisamment de données pour savoir comment renvoyer les lignes dans le bon ordre, et ensuite une phase qui renvoie les lignes remplissant les lacunes qu'elle n'a pas calculées dans le première phase. La répartition du travail entre les deux phases est également affectée par les paramètres de l'optimiseur basé sur les coûts. par exemple. Premiers rangs vs Tous les rangs.

Désormais, si la requête est en phase 1, la demande d'annulation semble au mieux être mise en file d'attente pour être appliquée à la fin de la phase 1, ce qui signifie que la requête continue de fonctionner.

Dans la phase 2, les lignes sont renvoyées par groupes, et après chaque groupe, la commande d'annulation peut prendre effet, donc en supposant que le pilote prend en charge la commande, la demande d'annulation entraînera la suppression de la requête.

La spécification de la commande d'annulation JDBC ne semble pas indiquer ce qui doit se passer si la requête ne s'arrête pas. Par conséquent, la commande peut attendre la confirmation de l'arrêt, ou peut expirer et revenir avec la requête toujours en cours d'exécution.