Succede perché il tuo codice richiede una connessione dal pool di connessioni Oracle e il pool di connessioni restituisce una connessione disconnessa/non aggiornata al DB Oracle. ODP.NET stesso non verifica lo stato di connessione della connessione inviata al client.
Quindi, per sicurezza, controlla lo connection status == Open
per la connessione ricevuta dal pool quando si esegue un Connection.Open()
O
lascia che ODP.NET faccia il controllo per te impostando Validate Connection = true
nella stringa di connessione in web.config.
Entrambi questi metodi hanno un impatto sulle prestazioni poiché testano lo stato della connessione ogni volta che è necessario connettersi al database.
Una terza opzione che utilizzo è l'uso delle eccezioni. Per prima cosa sii ottimista e usa la connessione qualunque viene restituita dal pool di connessioni. Se ottieni un ORA - 3135, richiedi una nuova connessione ed esegui di nuovo la tua query come un ciclo while. Nel migliore dei casi, puoi ottenere la tua prima connessione come valida e la tua query verrà eseguita. Nel peggiore dei casi, tutte le connessioni nel tuo pool sono obsolete, nel qual caso il codice verrà eseguito N volte (dove N è la dimensione del pool di connessioni).