これは、コードがOracle接続プールからの接続を要求し、接続プールが切断された/古い接続をOracleDBに返すために発生します。 ODP.NET自体は、クライアントに送信された接続の接続ステータスをテストしません。
したがって、安全のために、connection status == Open
を確認してください。 Connection.Open()
または
Validate Connection = true
を設定して、ODP.NETにチェックを任せます web.configの接続文字列にあります。
この両方の方法は、データベースに接続する必要があるたびに接続ステータスをテストするため、パフォーマンスに影響を与えます。
私が使用する3番目のオプションは、例外の使用です。まず楽観的になり、接続プールから返された接続を使用します。 ORA-3135を取得した場合は、新しい接続を要求し、whileループのようにクエリを再実行します。最良の場合、最初の接続を有効として取得すると、クエリが実行されます。最悪の場合、プール内のすべての接続が古くなっています。その場合、コードはN回実行されます(Nは接続プールのサイズです)。