sql >> Base de Datos >  >> RDS >> Oracle

ORACLE/ASP.NET:ORA-2020 - Demasiados enlaces a bases de datos... ¿qué está causando esto?

En primer lugar, la solución simple:verificaría dos veces que en la base de datos de producción el número de enlaces predeterminados es realmente 4.

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

Asumiendo que no vas a salir tan a la ligera:

Dices que cierras explícitamente la sesión, lo cual, según la documentación , debería significar que todos los enlaces asociados con esa sesión están cerrados. Aparte de eso, confieso una completa ignorancia sobre este punto.

No hay desventajas que se me ocurran. Tom Kyte sugiere , aunque hace mucho tiempo, que cada enlace de base de datos abierto utiliza 500k de memoria PGA. Si no tiene ninguno, obviamente esto causará un problema, pero debería estar más que bien para la mayoría de las situaciones.

Sin embargo, hay consecuencias no deseadas:imagina que subes este número a 100. Alguien codifica algo que continuamente abre enlaces y extrae una gran cantidad de datos a través de todos ellos select * from my_massive_table o similar. En lugar de 4 sesiones haciendo esto, tienes 100, que intentan transferir cientos de gigabytes simultáneamente. Su red muere bajo la tensión...

Probablemente haya más, pero te haces una idea.

Como ha notado, la mejor respuesta es "probablemente no", lo cual no es de mucha ayuda. No mencionas exactamente cómo estás terminando la sesión, pero si la estás matando en lugar de cerrarla correctamente, entonces definitivamente.

El uso de un enlace de base de datos genera un proceso secundario en el servidor remoto. Debido a que su servidor ya no está a cargo absoluto de este proceso, hay una gran cantidad de cosas que podrían hacer que quede huérfano o que no se cierre al finalizar el proceso principal. De ninguna manera esto sucede todo el tiempo, pero puede y lo hace.

Yo haría dos cosas.

  1. En su proceso, si se encuentra una excepción, envíese por correo electrónico los resultados de la siguiente consulta.

    select * 
      from v$dblink
    

    Como mínimo, al menos sabrá qué enlaces de bases de datos están abiertos en la sesión y le dará alguna forma de rastrearlos.

  2. Siga los consejos de documentación; específicamente lo siguiente:

    "Es posible que tenga que cerrar el enlace manualmente. Por ejemplo, cerrar enlaces cuando:

    • La conexión de red establecida por un enlace se usa con poca frecuencia en una aplicación.
    • La sesión del usuario debe finalizar."

El primero parece ajustarse exactamente a su situación. A menos que su proceso sea sensible al tiempo, lo que no parece ser el caso, entonces, ¿qué tiene que perder? La sintaxis es:

alter session close database link <linkname>