Isso acontece porque seu código solicita uma conexão do Oracle Connection Pool e o pool de conexões retorna uma conexão desconectada/obstante ao banco de dados Oracle. O ODP.NET não testa o status da conexão enviada ao cliente.
Portanto, para estar seguro, verifique o
connection status == Open
para a conexão recebida do pool quando você faz um Connection.Open() OU
deixe o ODP.NET fazer a verificação para você definindo
Validate Connection = true
em sua string de conexão em web.config. Ambos os métodos têm impacto no desempenho, pois testam o status da conexão sempre que você precisa se conectar ao banco de dados.
Uma terceira opção que eu uso é o uso de exceções. Primeiro, seja otimista e use qualquer conexão que seja retornada do pool de conexões. Se você obtiver um ORA - 3135, solicite uma nova conexão e execute sua consulta novamente como um loop while. Na melhor das hipóteses, você pode obter sua primeira conexão como válida e sua consulta será executada. Na pior das hipóteses, todas as conexões em seu pool estão obsoletas, caso em que o código será executado N vezes (onde N é o tamanho do pool de conexões).