Cela se produit parce que votre code demande une connexion au pool de connexions Oracle et que le pool de connexions renvoie une connexion déconnectée/périmée à la base de données Oracle. ODP.NET ne teste pas lui-même l'état de connexion de la connexion envoyée au client.
Alors pour être sûr, soit vous vérifiez le connection status == Open
pour la connexion reçue du pool lorsque vous effectuez un Connection.Open()
OU
laissez ODP.NET faire la vérification pour vous en définissant Validate Connection = true
dans votre chaîne de connexion dans web.config.
Ces deux méthodes ont un impact sur les performances car elles testent l'état de la connexion chaque fois que vous devez vous connecter à la base de données.
Une troisième option que j'utilise est l'utilisation d'exceptions. Soyez d'abord optimiste et utilisez la connexion quelle qu'elle soit renvoyée par le pool de connexions. Si vous obtenez un ORA - 3135, demandez une nouvelle connexion et exécutez à nouveau votre requête comme une boucle while. Dans le meilleur des cas, vous pouvez obtenir votre 1ère connexion comme valide et votre requête s'exécutera. Dans le pire des cas, toutes les connexions de votre pool sont obsolètes, auquel cas le code sera exécuté N fois (où N est la taille du pool de connexions).