Ocurre porque su código solicita una conexión del grupo de conexiones de Oracle y el grupo de conexiones devuelve una conexión desconectada/obsoleta a la base de datos de Oracle. ODP.NET no prueba por sí mismo el estado de conexión de la conexión enviada al cliente.
Entonces, para estar seguro, verifica el connection status == Open
para la conexión recibida del grupo cuando haces un Connection.Open()
O
deje que ODP.NET haga la verificación por usted configurando Validate Connection = true
en su cadena de conexión en web.config.
Ambos métodos tienen un impacto en el rendimiento, ya que prueban el estado de la conexión cada vez que necesita conectarse a la base de datos.
Una tercera opción que utilizo es el uso de excepciones. Primero, sea optimista y use cualquier conexión que se devuelva del conjunto de conexiones. Si obtiene un ORA - 3135, solicite una nueva conexión y ejecute su consulta nuevamente como un ciclo while. En el mejor de los casos, puede obtener su primera conexión como válida y su consulta se ejecutará. En el peor de los casos, todas las conexiones de su grupo están obsoletas, en cuyo caso el código se ejecutará N veces (donde N es el tamaño del grupo de conexiones).