sql >> Database >  >> RDS >> Oracle

ORACLE/ASP.NET:ORA-2020 - Te veel databaselinks... wat veroorzaakt dit?

Ten eerste de simpele oplossing:ik zou controleren of in de productiedatabase het aantal standaardlinks eigenlijk is 4.

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

Ervan uitgaande dat je er niet zo makkelijk vanaf komt:

U zegt dat u de sessie expliciet afsluit, wat volgens de documentatie , zou moeten betekenen dat alle koppelingen die aan die sessie zijn gekoppeld, zijn gesloten. Afgezien daarvan beken ik volledige onwetendheid op dit punt.

Er zijn geen nadelen die ik kan bedenken. Tom Kyte suggereert , zij het lang geleden, dat elke open databaselink 500k PGA-geheugen gebruikt. Als je er geen hebt, zal dit uiteraard een probleem veroorzaken, maar voor de meeste situaties zou het meer dan prima moeten zijn.

Er zijn echter onbedoelde gevolgen:stel je voor dat je dit aantal verhoogt tot 100. Iemand codeert iets dat voortdurend links opent en veel gegevens door ze allemaal trekt select * from my_massive_table of vergelijkbaar. In plaats van 4 sessies die dit doen, heb je 100, die probeert honderden gigabytes tegelijk over te dragen. Je netwerk sterft onder de druk...

Er is waarschijnlijk meer, maar je snapt het wel.

Zoals je hebt opgemerkt, is het beste antwoord "waarschijnlijk niet", wat niet veel helpt. Je vermeldt niet precies hoe je de sessie beëindigt, maar als je het doodt in plaats van gracieus af te sluiten, dan zeker.

Het gebruik van een databaselink leidt tot een onderliggend proces op de externe server. Omdat uw server niet langer de absolute leiding heeft over dit proces, zijn er talloze dingen die ervoor kunnen zorgen dat deze verweesd wordt of anderszins niet wordt afgesloten bij beëindiging van het bovenliggende proces. Dit gebeurt zeker niet de hele tijd, maar het kan en gebeurt.

Ik zou twee dingen doen.

  1. Als er tijdens uw proces een uitzondering wordt aangetroffen, e-mail dan de resultaten van de volgende vraag naar uzelf.

    select * 
      from v$dblink
    

    U weet in ieder geval welke databasekoppelingen in de sessie geopend zijn en geeft u een manier om ze te traceren.

  2. Volg het documentatieadvies; specifiek het volgende:

    "Misschien heeft u gelegenheid om de link handmatig te sluiten. Sluit links bijvoorbeeld wanneer:

    • De netwerkverbinding die tot stand wordt gebracht door een link wordt niet vaak gebruikt in een applicatie.
    • De gebruikerssessie moet worden beëindigd."

De eerste lijkt precies bij jouw situatie te passen. Tenzij uw proces tijdgevoelig is, wat niet het geval lijkt te zijn, wat heeft u dan te verliezen? De syntaxis is:

alter session close database link <linkname>


  1. Hoe maak je een externe sleutel in Oracle SQL Developer?

  2. Meerdere Mysql-instructies groeperen om het aantal meerdere statussen op te halen

  3. Waarom wordt het char-gegevenstype automatisch geconverteerd naar bpchar?

  4. MySQL LIKE-beperking