Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORACLE/ASP.NET :ORA-2020 - Trop de liens de base de données... qu'est-ce qui en est la cause ?

Tout d'abord, la solution simple :je vérifierais que dans la base de données de production, le nombre de liens par défaut est réel 4.

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

En supposant que vous n'allez pas vous en tirer à la légère :

Vous dites que vous fermez explicitement la session, ce qui, selon la documentation , devrait signifier que tous les liens associés à cette session sont fermés. A part ça j'avoue une totale ignorance sur ce point.

Il n'y a aucun inconvénient auquel je puisse penser. Tom Kyte suggère , quoique il y a longtemps, que chaque lien de base de données ouvert utilise 500k de mémoire PGA. Si vous n'en avez pas, cela causera évidemment un problème, mais cela devrait suffire dans la plupart des situations.

Il y a cependant des conséquences imprévues :imaginez que vous augmentez ce nombre à 100. Quelqu'un code quelque chose qui ouvre continuellement des liens et attire beaucoup de données à travers chacun d'eux select * from my_massive_table ou similaire. Au lieu de 4 sessions, vous en avez 100, qui tentent de transférer simultanément des centaines de gigaoctets. Votre réseau meurt sous la pression...

Il y en a probablement plus, mais vous voyez l'image.

Comme vous l'avez noté, la meilleure réponse est "probablement pas", ce qui n'est pas d'une grande aide. Vous ne mentionnez pas exactement comment vous terminez la session, mais si vous la tuez plutôt que de la fermer gracieusement, alors définitivement.

L'utilisation d'un lien de base de données génère un processus enfant sur le serveur distant. Parce que votre serveur n'est plus en charge absolue de ce processus, il y a une myriade de choses qui pourraient le rendre orphelin ou autrement ne pas se fermer à la fin du processus parent. Cela ne se produit en aucun cas tout le temps, mais cela peut arriver et arrive.

Je ferais deux choses.

  1. Dans votre processus, si une exception est rencontrée, envoyez-vous par e-mail les résultats de la requête suivante.

    select * 
      from v$dblink
    

    Au minimum, vous saurez quels liens de base de données sont ouverts dans la session et vous donnerez un moyen de les retrouver.

  2. Suivez les conseils de la documentation ; spécifiquement ce qui suit :

    "Vous pouvez être amené à fermer le lien manuellement. Par exemple, fermez les liens lorsque :

    • La connexion réseau établie par un lien est rarement utilisée dans une application.
    • La session utilisateur doit être fermée."

Le premier semble correspondre exactement à votre situation. À moins que votre processus ne soit urgent, ce qui ne semble pas être le cas, alors qu'avez-vous à perdre ? La syntaxe est :

alter session close database link <linkname>