Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

ORACLE/ASP.NET:ORA-2020 - Muitos links de banco de dados... o que está causando isso?


Em primeiro lugar, a solução simples:eu verificaria se no banco de dados de produção o número de links padrão é realmente 4.
select *
  from v$system_parameter
 where name = 'OPEN_LINKS'

Supondo que você não vai sair tão facilmente:

Você diz que fecha explicitamente a sessão, o que, de acordo com a documentação , deve significar que todos os links associados a essa sessão estão fechados. Fora isso confesso total ignorância nesse ponto.

Não há desvantagens que eu possa pensar. Tom Kyte sugere , embora há muito tempo, que cada link de banco de dados aberto usa 500k de memória PGA. Se você não tiver nenhum, isso obviamente causará um problema, mas deve ser mais do que bom para a maioria das situações.

Há, no entanto, consequências não intencionais:imagine que você aumente esse número para 100. Alguém codifica algo que abre links continuamente e extrai muitos dados através de todos eles select * from my_massive_table ou similar. Em vez de 4 sessões fazendo isso, você tem 100, que está tentando transferir centenas de gigabytes simultaneamente. Sua rede morre sob a tensão...

Há provavelmente mais, mas você começa a imagem.

Como você notou, a melhor resposta é "provavelmente não", o que não ajuda muito. Você não menciona exatamente como está encerrando a sessão, mas se estiver matando-a em vez de fechar normalmente, definitivamente.

O uso de um link de banco de dados gera um processo filho no servidor remoto. Como seu servidor não está mais no comando absoluto desse processo, há uma infinidade de coisas que podem fazer com que ele se torne órfão ou não feche após o término do processo pai. De forma alguma isso acontece o tempo todo, mas pode e acontece.

Eu faria duas coisas.

  1. Em seu processo, se uma exceção for encontrada, envie por e-mail os resultados da consulta a seguir para você mesmo.
    select * 
      from v$dblink
    

    No mínimo, você saberá quais links de banco de dados estão abertos na sessão e fornecerá uma maneira de rastreá-los.

  2. Siga as orientações documentais; especificamente o seguinte:

    "Você pode ter a oportunidade de fechar o link manualmente. Por exemplo, fechar links quando:
    • A conexão de rede estabelecida por um link é usada com pouca frequência em um aplicativo.
    • A sessão do usuário deve ser encerrada."

O primeiro parece se encaixar exatamente na sua situação. A menos que seu processo seja sensível ao tempo, o que não parece ser o caso, então o que você tem a perder? A sintaxe é:
alter session close database link <linkname>