Det händer eftersom din kod begär en anslutning från Oracle Connection Pool och anslutningspoolen returnerar en frånkopplad/inaktuell anslutning till Oracle DB. ODP.NET testar inte själv anslutningsstatusen för anslutningen som skickas till klienten.
Så för säkerhets skull kontrollerar du antingen connection status == Open
för anslutningen som tas emot från poolen när du gör en Connection.Open()
ELLER
låt ODP.NET göra kontrollen åt dig genom att ställa in Validate Connection = true
i din anslutningssträng i web.config.
Båda dessa metoder har en inverkan på prestandan eftersom de testar anslutningsstatusen varje gång du behöver ansluta till databasen.
Ett tredje alternativ som jag använder är användningen av undantag. Var först optimistisk och använd den anslutning som returneras från anslutningspoolen. Om du får en ORA - 3135, begär då en ny anslutning och kör din fråga igen som en while-loop. I bästa fall kan du få din första anslutning som giltig och din fråga kommer att köras. I värsta fall är alla anslutningar i din pool inaktuella i vilket fall koden kommer att exekveras N gånger (där N är anslutningspoolens storlek).