sql >> Databáze >  >> RDS >> PostgreSQL

Go sql - připravený rozsah příkazu

Připravené příkazy slouží k tomu, abyste mohli provádět opakující se příkazy SQL, které se mohou lišit například pouze v hodnotách parametrů.

Nejsou určeny k tomu, aby žily „dlouho“, protože připravený příkaz může (jsou-li volán z transakce) rezervovat aktivní databázové připojení („dlouhý“ znamená, když se nepoužívají; je naprosto v pořádku opakovaně spouštět připravený příkaz. krát, i když to bude trvat dlouho). Připojení je drahý zdroj a mělo by být drženo pouze tak dlouho, jak je potřeba. Pouhým vytvořením hromady připravených příkazů a jejich nezavřením byste mohli vyčerpat aktivní / povolená připojení a zablokovat další komunikaci s db serverem.

Pokud chcete provést stejný příkaz insert, použijte připravený příkaz , update nebo select příkaz s různými parametry vícekrát v jednom požadavku (HTTP). Nepoužívejte připravené požadavky k přežití (HTTP).

V určitých implementacích ovladačů a databázových serverech mohou připravené příkazy také zahrnovat prostředky alokované na samotném DB serveru (nikoli v aplikaci Go). Například připravený příkaz může být předem zkompilován na DB serveru a server může připravit plán provádění dotazu, alokovat pro něj určité zdroje, jako je paměť. Ty mohou být trvale rezervovány, dokud nebude připravený výpis uzavřen.

Existuje článek (v komentářích níže odeslal Myles McDonnell), který se zabývá podrobnostmi implementace Připravených prohlášení v Go. Uvádí, že pokud připravené příkazy nejsou vytvořeny z transakcí, uvolní připojení zpět k fondu připojení, ale v případě potřeby se pokusí znovu použít stejné, na kterém byly připraveny (protože pokud db server pomáhá / také hraje aktivní roli v připraveném výpisu je vázán na připojení na straně serveru). Pokud ne, znovu se připraví je na novém připojení (způsobuje nežádoucí režii výkonu).

Celkově vzato, to, co popisujete, je funkční model, a pokud máte nízký počet připravených příkazů, které jsou potřeba/vykonávány v mnoha následných požadavcích, mohou znamenat kratší dobu odezvy. Znamená to ale také, že z dlouhodobého hlediska mohou vést k tomu, že všechny vaše připravené výpisy budou připraveny na všech připojeních fondu. Rozhodněte, zda je to ve vašem případě přijatelné.

Obecně je tomu třeba se vyhnout (a připravený příkaz uzavřít před koncem požadavku HTTP), ale pokud jich máte jen několik a potřebujete je v mnoha po sobě následujících požadavcích, můžete je přesunout mimo rozsah požadavku .




  1. Třídění více polí v MySQL

  2. Dotaz Mysql zkontrolujte typ sloupce blob v klauzuli where

  3. Co musím udělat, abych otevřel adresy URL se speciálními znaky

  4. Jaký je tedy nejlepší způsob, jak zkontrolovat, zda řádek existuje? EXISTS, COUNT nebo num_rows?