Det sker, fordi din kode anmoder om en forbindelse fra Oracle Connection Pool, og forbindelsespuljen returnerer en afbrudt/forældet forbindelse til Oracle DB. ODP.NET tester ikke selv forbindelsesstatussen for forbindelsen sendt til klienten.
Så for en sikkerheds skyld tjekker du enten connection status == Open
for forbindelsen modtaget fra puljen, når du laver en Connection.Open()
ELLER
lad ODP.NET gøre kontrollen for dig ved at indstille Validate Connection = true
i din forbindelsesstreng i web.config.
Begge disse metoder har en indvirkning på ydeevnen, da de tester forbindelsesstatus, hver gang du skal oprette forbindelse til databasen.
En tredje mulighed, som jeg bruger, er brug af undtagelser. Vær først optimistisk og brug den forbindelse, der returneres fra forbindelsespuljen. Hvis du får en ORA - 3135, så anmod om en ny forbindelse og kør din forespørgsel igen som en while-løkke. I bedste tilfælde kan du få din første forbindelse som gyldig, og din forespørgsel udføres. I værste fald er alle forbindelserne i din pool forældede, i hvilket tilfælde koden vil blive eksekveret N gang (hvor N er forbindelsespuljens størrelse).