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

ORACLE/ASP.NET:ORA-2020 – Příliš mnoho databázových odkazů... co to způsobuje?

Za prvé, jednoduché řešení:Zkontroloval bych, že v produkční databázi je počet výchozích odkazů ve skutečnosti 4.

select *
  from v$system_parameter
 where name = 'OPEN_LINKS'

Za předpokladu, že z toho nevylezeš na lehkou váhu:

Říkáte, že výslovně ukončujete relaci, což podle dokumentaci , by mělo znamenat, že všechny odkazy spojené s danou relací jsou uzavřeny. Kromě toho se přiznám k naprosté neznalosti v tomto bodě.

Nenapadají mě žádné nevýhody. Tom Kyte navrhuje , i když už dávno, že každý otevřený odkaz na databázi využívá 500k PGA paměti. Pokud žádné nemáte, pak to zjevně způsobí problém, ale ve většině situací by to mělo být více než v pořádku.

Má to však nezamýšlené důsledky:Představte si, že toto číslo zvýšíte na 100. Někdo kóduje něco, co neustále otevírá odkazy a přes všechny čerpá spoustu dat select * from my_massive_table nebo podobné. Místo 4 relací, které to dělají, máte 100, které se pokouší přenést stovky gigabajtů současně. Vaše síť pod tlakem umírá...

Pravděpodobně je toho více, ale chápete.

Jak jste si všimli, nejlepší odpověď je „pravděpodobně ne“, což moc nepomůže. Neuvádíte přesně, jak relaci ukončujete, ale pokud ji spíše zabíjíte, než abyste ji elegantně zavírali, pak určitě.

Pomocí odkazu na databázi se na vzdáleném serveru vytvoří podřízený proces. Vzhledem k tomu, že váš server již nemá absolutní odpovědnost za tento proces, existuje mnoho věcí, které by mohly způsobit, že se stane osiřelým nebo se jinak neuzavře po ukončení nadřazeného procesu. V žádném případě se to nestane po celou dobu, ale může a také se to děje.

Udělal bych dvě věci.

  1. Pokud během procesu narazíte na výjimku, pošlete si e-mailem výsledky následujícího dotazu.

    select * 
      from v$dblink
    

    Přinejmenším budete vědět, jaké databázové odkazy jsou v relaci otevřené, a dá vám nějaký způsob, jak je vysledovat.

  2. Postupujte podle pokynů v dokumentaci; konkrétně následující:

    „Můžete mít příležitost zavřít odkaz ručně. Například úzké odkazy, když:

    • Síťové připojení vytvořené odkazem se v aplikaci používá zřídka.
    • Uživatelská relace musí být ukončena."

Zdá se, že první přesně odpovídá vaší situaci. Pokud váš proces není časově citlivý, což se nezdá být tento případ, co pak můžete ztratit? Syntaxe je:

alter session close database link <linkname>


  1. Jsou vícenásobné vložky mysql v rámci jediného dotazu atomické?

  2. Nejjednodušší způsob, jak ověřit odkaz na e-mail PHP

  3. MySQL vrátí true/false, pokud hodnota col !=zadaná hodnota

  4. Ukládání čísel sociálního zabezpečení