sql >> Databasteknik >  >> RDS >> Oracle

ORACLE/ASP.NET:ORA-2020 - För många databaslänkar... vad beror detta på?

För det första, den enkla lösningen:jag skulle dubbelkolla att antalet standardlänkar i produktionsdatabasen är faktiskt 4.

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

Förutsatt att du inte kommer att gå av så lätt:

Du säger att du uttryckligen stänger sessionen, vilket enligt dokumentationen , bör betyda att alla länkar som är kopplade till den sessionen är stängda. I övrigt erkänner jag fullständig okunnighet på denna punkt.

Det finns inga nackdelar jag kan komma på. Tom Kyte föreslår , om än för länge sedan, att varje öppen databaslänk använder 500k PGA-minne. Om du inte har några kommer detta uppenbarligen att orsaka problem, men det borde vara mer än bra för de flesta situationer.

Det finns dock oavsiktliga konsekvenser:Föreställ dig att du höjer det här siffran till 100. Någon kodar något som kontinuerligt öppnar länkar och drar mycket data genom alla select * from my_massive_table eller liknande. Istället för 4 sessioner som gör detta har du 100, som försöker överföra hundratals gigabyte samtidigt. Ditt nätverk dör under påfrestningen...

Det finns säkert fler men ni förstår.

Som du har noterat är det bästa svaret "förmodligen inte", vilket inte är mycket hjälp. Du nämner inte exakt hur du avslutar sessionen, men om du avbryter den istället för att avsluta på ett elegant sätt så definitivt.

Att använda en databaslänk skapar en underordnad process på fjärrservern. Eftersom din server inte längre är absolut ansvarig för den här processen finns det en mängd saker som kan göra att den blir föräldralös eller på annat sätt inte stängs när den överordnade processen avslutas. Detta händer inte på något sätt hela tiden, men det kan och gör det.

Jag skulle göra två saker.

  1. I din process, om ett undantag påträffas, e-posta resultatet av följande fråga till dig själv.

    select * 
      from v$dblink
    

    Som ett minimum kommer du att veta vilka databaslänkar som är öppna i sessionen och ge dig ett sätt att spåra dem.

  2. Följ dokumentationsråden; särskilt följande:

    "Du kan ha tillfälle att stänga länken manuellt. Till exempel, nära länkar när:

    • Nätverksanslutningen som upprättas av en länk används sällan i en applikation.
    • Användarsessionen måste avslutas."

Den första verkar passa exakt i din situation. Såvida inte din process är tidskänslig, vilket inte verkar vara fallet, vad har du då att förlora? Syntaxen är:

alter session close database link <linkname>


  1. Oracle.DataAccess.Client beroenden

  2. ORA-01002:hämtning ur sekvens

  3. Hur undkommer jag en mysql-sökning/gilla-fråga korrekt?

  4. Steg för steg R12.2.6 EBS-installation på Virtual Box