Oracle
 sql >> Database >  >> RDS >> Oracle

ORACLE/ASP.NET:ORA-2020 - Troppi collegamenti al database... cosa sta causando questo?

Innanzitutto, la soluzione semplice:ricontrollerei che nel database di produzione il numero di collegamenti predefiniti sia effettivamente 4.

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

Supponendo che non te la cavi alla leggera:

Dici di chiudere esplicitamente la sessione, che, secondo la documentazione , dovrebbe significare che tutti i collegamenti associati a quella sessione sono chiusi. A parte questo confesso la completa ignoranza su questo punto.

Non ci sono svantaggi a cui mi viene in mente. Tom Kyte suggerisce , anche se molto tempo fa, che ogni collegamento al database aperto utilizza 500k di memoria PGA. Se non ne hai, questo ovviamente causerà un problema, ma dovrebbe andare più che bene per la maggior parte delle situazioni.

Ci sono, tuttavia, conseguenze indesiderate:immagina di aumentare questo numero a 100. Qualcuno codifica qualcosa che apre continuamente collegamenti e estrae molti dati attraverso tutti loro select * from my_massive_table o simili. Invece di 4 sessioni che fanno questo hai 100, che sta tentando di trasferire centinaia di gigabyte contemporaneamente. La tua rete muore sotto sforzo...

Probabilmente ce n'è di più, ma ottieni l'immagine.

Come hai notato, la risposta migliore è "probabilmente no", il che non è di grande aiuto. Non menzioni esattamente come stai terminando la sessione, ma se la stai uccidendo piuttosto che chiuderla con grazia, allora sicuramente.

L'utilizzo di un collegamento al database genera un processo figlio sul server remoto. Poiché il tuo server non è più responsabile assoluto di questo processo, ci sono una miriade di cose che potrebbero renderlo orfano o altrimenti non chiudersi al termine del processo padre. In nessun modo questo accade per tutto il tempo, ma può e succede.

Farei due cose.

  1. Nel tuo processo, se viene rilevata un'eccezione, invia un'e-mail a te stesso con i risultati della seguente query.

    select * 
      from v$dblink
    

    Come minimo saprai quali collegamenti al database sono aperti nella sessione e ti darà un modo per rintracciarli.

  2. Segui i consigli sulla documentazione; in particolare i seguenti:

    "Potresti avere occasione di chiudere il link manualmente. Ad esempio, chiudi link quando:

    • La connessione di rete stabilita da un collegamento viene utilizzata raramente in un'applicazione.
    • La sessione utente deve essere terminata."

Il primo sembra adattarsi esattamente alla tua situazione. A meno che il tuo processo non sia sensibile al tempo, cosa che non sembra essere il caso, allora cosa hai da perdere? La sintassi è:

alter session close database link <linkname>