バックグラウンド
Oracleデータベースに接続するWCFサービスを使用するC#/VB.netクライアントアプリケーションがあります。Webサービスは、.NET FrameworkのOracle用データプロバイダーを使用してデータベースに接続します(ODPと混同しないでください)。私たちのテスターは、散発的なOracleアカウントのロックを経験しました。これは、ユーザーのOracleパスワードを変更した直後に発生するようです。dba_audit_trailログは、ユーザーまたはクライアントのアクティビティなしで、非常に定期的な間隔(つまり、ドット上で2分ごと)での自動接続試行のように見えるものを明らかにしました。多数のログ(IIS、WCFトレース、メッセージログなど)により、これらの接続の試行がクライアントアプリケーションによって直接開始されていないことが確認されています。これらは、Webサービスから独立して、またはSystem.Data.OracleClientライブラリ内から提供されている必要があります。
場合によっては、これらの自動試行はパスワードが変更される前に開始され、データベースに正常に接続されますが、パスワードが変更されるとすぐに、無効なユーザー名/パスワードに対して次の試行が失敗します。3回試行すると、アカウントがロックされます。これらの定期的な接続試行のソースを見つけようとしています。
オラクルのフォーラムで、非常によく似た、しかし答えのない問題を見つけました。
現在の考え
最新の調査により、接続プールによる予期しない動作であると考えられました。パスワードを変更する前にユーザーがWebサービスに接続した場合、元の接続文字列に対して接続プールが作成されます。パスワードを変更してWebサービスに再度ログインした後、データプロバイダーは新しい接続文字列に基づいて新しい接続プールを作成します。
データプロバイダー内の何かが、最初の接続プールから古い接続を維持しようとしている可能性がありますか?おそらく、最初の接続プールは古い接続を破棄し、新しい接続を(現在は無効な接続文字列で)補充しようとしています。何が原因でしょうか?注:最小/最大プールサイズ(0/100)のデフォルト設定を使用しています。
コードが最初の接続プールからの接続に直接アクセスしようとしているとは思われません。ユーザーのセッションには前のセッションのパスワードのメモリがないため、最初の接続プールを参照するために古い接続文字列を使用することはありません。さらに、私たちのコードには、私たちが見ている非常に正確な接続間隔を説明するものは何もありません。