Dzieje się tak, ponieważ Twój kod żąda połączenia z puli połączeń Oracle, a pula połączeń zwraca rozłączone/nieaktualne połączenie z bazą danych Oracle. ODP.NET sam nie testuje stanu połączenia wysyłanego do klienta.
Aby być bezpiecznym, sprawdź connection status == Open
dla połączenia otrzymanego z puli podczas wykonywania Connection.Open()
LUB
pozwól ODP.NET sprawdzić za Ciebie, ustawiając Validate Connection = true
w ciągu połączenia w web.config.
Obie te metody mają wpływ na wydajność, ponieważ testują stan połączenia za każdym razem, gdy musisz połączyć się z bazą danych.
Trzecią opcją, z której korzystam, jest stosowanie wyjątków. Najpierw bądź optymistyczny i używaj tego, co jest zwracane z puli połączeń. Jeśli otrzymasz ORA - 3135, poproś o nowe połączenie i wykonaj zapytanie ponownie, jak w pętli while. W najlepszym przypadku możesz uzyskać pierwsze połączenie jako prawidłowe, a zapytanie zostanie wykonane. W najgorszym przypadku wszystkie połączenia w Twojej puli są przestarzałe, w którym to przypadku kod zostanie wykonany N czasu (gdzie N to rozmiar puli połączeń).