sql >> Databáze >  >> RDS >> Oracle

Když zavolám PreparedStatement.cancel() v aplikaci JDBC, skutečně to zabije v databázi Oracle?

Vezměte prosím na vědomí, že to, co říkám níže, je založeno na pozorováních a úsudcích používaného Oracle a není založeno na žádném hlubokém porozumění vnitřním prvkům Oracle. Nic z toho by nemělo být považováno za směrodatné.

To, co devítistranný řekl ve svém prvním odstavci, je správné. Dejte si však pozor na navrhovaný test. Ne všechny dlouhodobé dotazy oracle jsou stejné. Zdá se, že dotazy se vyhodnocují ve dvou fázích, první fáze, která kombinuje dostatek dat, aby věděla, jak vrátit řádky ve správném pořadí, a druhá fáze, která vrací řádky vyplňující mezery, které nevypočítala v první fáze. Rozdělení práce mezi dvě fáze je ovlivněno i nastavením optimalizátoru založeného na nákladech. např. První řádky vs. všechny řádky.

Nyní, pokud je dotaz ve fázi 1, zdá se, že požadavek na zrušení je v nejlepším případě zařazen do fronty, aby mohl být aplikován na konci fáze 1, což znamená, že dotaz pokračuje v provozu.

Ve fázi 2 jsou řádky vráceny ve svazcích a po každém svazku se může projevit příkaz cancel, takže za předpokladu, že ovladač příkaz podporuje, bude mít požadavek na zrušení za následek ukončení dotazu.

Zdá se, že specifikace příkazu JDBC cancel neříká, co by se mělo stát, pokud se dotaz nepřestane spouštět, a proto může příkaz čekat na potvrzení ukončení nebo může vypršet časový limit a vrátit se se stále spuštěným dotazem.



  1. CHAR() Příklady v MySQL

  2. Chrání mysql_real_escape_string() PLNĚ před SQL injection?

  3. SQL Server 2016:Vytvořte tabulku ze skriptu SQL

  4. Řešení chyby Drop Column v Oracle 18c a 19c