sql >> Database teknologi >  >> RDS >> Oracle

Når jeg kalder PreparedStatement.cancel() i et JDBC-program, dræber det det så i en Oracle-database?

Bemærk venligst, at det, jeg siger nedenfor, er baseret på observationer og konklusioner af Oracle i brug, og er ikke baseret på nogen dyb forståelse af Oracles indre. Intet af det bør betragtes som autoritativt.

Hvad ninesided sagde i deres første afsnit er korrekt. Pas dog på den foreslåede test. Ikke alle langvarige orakelforespørgsler er ens. Det ser ud til, at forespørgsler evalueres over to faser, først en fase, der kombinerer tilstrækkelige data til at vide, hvordan man returnerer rækkerne i den rigtige rækkefølge, og for det andet en fase, der returnerer rækkerne, der udfylder de huller, som den ikke har beregnet i første fase. Arbejdsfordelingen mellem de to faser er også påvirket af indstillingerne af den omkostningsbaserede optimizer. for eksempel. Første rækker vs Alle rækker.

Nu, hvis forespørgslen er i fase 1, ser annulleringsanmodningen i bedste fald ud til at stå i kø for at blive anvendt i slutningen af ​​fase 1, hvilket betyder, at forespørgslen fortsætter med at fungere.

I fase 2 returneres rækker i bundter, og efter hver gruppe kan annulleringskommandoen træde i kraft, så forudsat at driveren understøtter kommandoen, vil annulleringsanmodningen resultere i, at forespørgslen bliver dræbt.

Specifikationen for JDBC-annulleringskommandoen lader ikke til at sige, hvad der skal ske, hvis forespørgslen ikke stopper med at køre, og derfor kan kommandoen vente på bekræftelse af dræbningen, eller den kan timeout og vende tilbage, mens forespørgslen stadig kører.



  1. Tips til at reducere din SQL Server-kompleksitet

  2. MySQL:Vælg alle datoer i et interval, selvom der ikke er nogen registreringer til stede

  3. Transparent Data Encryption (TDE) i SQL Server i en AlwaysOn Availability Group på eksempel

  4. Sådan formateres SQLite-resultater som en tabel