Это происходит потому, что ваш код запрашивает соединение из пула соединений Oracle, а пул соединений возвращает отключенное / устаревшее соединение с БД Oracle.ODP.NET сама не проверяет состояние соединения для соединения, отправленного клиенту.
Поэтому, чтобы быть в безопасности, либо проверяйте connection status == Open
для соединения, полученного из пула, когда вы выполняете Connection.Open ()
ИЛИ
пусть ODP.NET выполнит за вас проверку, установив Validate Connection = true
в строке подключения в web.config.
Оба эти метода влияют напроизводительность, поскольку они проверяют состояние соединения каждый раз, когда вам нужно подключиться к базе данных.
Третий вариант, который я использую, - это использование исключений.Сначала будьте оптимистичны и используйте любое соединение, возвращаемое из пула соединений.Если вы получаете ORA - 3135, запросите новое соединение и снова выполните свой запрос, как цикл while.В лучшем случае вы можете получить ваше первое соединение как действительное, и ваш запрос будет выполнен.В худшем случае все соединения в вашем пуле устарели, и в этом случае код будет выполняться N раз (где N - размер пула соединений).