Domanda

Ho un'app ASP.Net 2.0 con carico bilanciato (che non utilizza lo stato sessione) su IIS5 che esegue il backup su un singolo server Oracle 10g, utilizzando la versione 10.1.0.301 dei driver ODAC/ODP.Net.Dopo un lungo periodo di inattività (alcune ore), l'applicazione, in modo apparentemente casuale, lancerà un'eccezione Oracle:

Eccezione:ORA-03113:end-of-file sul canale di comunicazione su Oracle.DataAccess.Client.oracleException.Handleerrorhelper (INT32 ERRCODE, ORACLECONNection Conn, Intptr OpSerrctx, oposqlValctx* poposqlvalctx, oggetto SRC, procedura di stringa) su Oracle.DataAccess.OraCLETERERS Requisito, FillRequest booleano, comportamento CommandBehavior) su Oracle.DataAccess.Client.oraclecommand.system.data.idbcommand.executeder ()

...La parte Oracle dello stack termina qui...

Stiamo creando nuove connessioni su ogni richiesta, abbiamo l'apertura e la chiusura racchiuse in un try/catch/finally per garantire la corretta chiusura della connessione e il tutto è racchiuso in un blocco using (OracleConnection yadayada) {...}.Questo problema non sembra legato al riavvio dell'applicazione ASP.Net dopo essere stata interrotta per inattività.

Dobbiamo ancora riprodurre il problema da soli.Pensieri, preghiere, aiuto?


Di più: Verificato con l'IT, il firewall non è impostato per interrompere le connessioni tra questi server.

È stato utile?

Soluzione

ORA-03113:fine del file sul canale di comunicazione

Il database ti informa che la connessione di rete non esiste più.Ciò potrebbe essere dovuto al fatto che:

  1. Un problema di rete: connessione difettosa o problema del firewall
  2. Il processo server sul database che ti sta servendo è morto inaspettatamente.

Per 1) (firewall) cercare su tahiti.oracle.com SQLNET.EXPIRE_TIME.Questo è un parametro sqlnet.ora che invierà regolarmente un pacchetto di rete a un intervallo configurabile, ovvero:impostando questa impostazione il firewall crederà che la connessione sia attiva.

Per 1) (rete) parla con l'amministratore di rete (la connessione potrebbe essere inaffidabile)

Per 2) Controlla il alert.log per errori.Se il processo del server fallisce, verrà visualizzato un messaggio di errore.Verrà inoltre scritto un file di traccia per consentire al supporto di identificare il problema.Il messaggio di errore farà riferimento al file di traccia.

È possibile sollevare problemi di supporto all'indirizzo metalink.oracle.com con un idoneo Customer Service Identifier (CSI)

Altri suggerimenti

Aggiungere Convalida connessione=true alla stringa di connessione.

Guarda a questo blog per saperne di più.

DETTAGLI:Dopo OracleConnection.Close() la vera connessione al database non termina.L'oggetto connessione viene reinserito nel pool di connessioni.L'uso del pool di connessioni è implicito da ODP.NET.Se crei una nuova connessione ne ottieni una del pool.Se questa connessione è "ancora aperta" il metodo OracleConnection.Open() non crea realmente una nuova connessione.Se la connessione reale viene interrotta (per qualsiasi motivo) si verifica un errore alla prima selezione, aggiornamento, inserimento o eliminazione.

Con Validate Connection la connessione reale viene convalidata nel metodo Open().

Controlla che non ci sia un firewall che interrompe la connessione dopo un certo periodo di tempo (questa è stata la causa di un problema simile che abbiamo avuto noi)

fine del file sul canale di comunicazione:

Uno dei possibili errori è dovuto al fatto che il database non riesce a scrivere il registro quando è in fase di apertura;

La soluzione controlla il database se è in esecuzione in ARCHIVELOG o NOARCHIVELOG

per verificarne l'utilizzo

select log_mode from v$database;

se è acceso ARCHIVELOG provare a trasformarsi in NOARCHIVELOG

utilizzando sqlplus

  • montaggio di avvio
  • alterare il database noarchivelog;
  • alterare l'apertura del database;

se funziona per questo

Quindi è possibile regolare l'area di recupero del flash, è possibile che l'area di recupero del flash sia piena -> quindi dopo aver confermato che l'area di flashrecovery ha lo spazio necessario, è possibile modificare il database nel file ARCHIVELOG

Questo messaggio di errore può essere generato nei registri dell'applicazione quando il problema effettivo è che il server del database Oracle ha esaurito lo spazio.

Dopo aver corretto il problema dello spazio, questo particolare messaggio di errore è scomparso.

Potresti provare questo trucco del registro:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DeadGWDetectDefault"=dword:00000001
"KeepAliveTime"=dword:00120000

Se funziona, continua ad aumentare il KeepAliveTime.Attualmente è impostato su 2 minuti.

Bello l'articolo citato in precedenza. http://forums.oracle.com/forums/thread.jspa?threadID=191750 (per quanto va)

Se questo non è qualcosa che viene eseguito frequentemente (non farlo nella tua home page), puoi disattivare il pool di connessioni.

C'è un altro "trucco" che non è menzionato nell'articolo.Se la prima cosa che provi a fare con la connessione è chiamare una procedura memorizzata, ODP si BLOCCA!!!!Non riceverai una condizione di errore da gestire, solo un HANG completamente noioso!L'unico modo per risolverlo è disattivare il pool di connessioni.Una volta fatto ciò, tutti i problemi sono scomparsi.

Il pooling è utile in alcune situazioni, ma al costo di una maggiore complessità attorno alla prima istruzione di ogni connessione.

Se l'approccio alla gestione degli errori è così valido, perché non danno a ODP la possibilità di gestirlo per noi????

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top