1

.NET 3.5 で動作し、Oracle のクライアントを使用してデータベースに接続する C# Windows Forms アプリケーションを作成しています (.NET 4.0 以降にアップグレードできればよいのですが、できません)。アプリケーションには、通常のパターンに従う多くのコードがあります。ここに疑似コードがあります:

var worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();

...

private void worker_DoWork(object sender, DoWorkEventArgs e) {
    using(var conn = OpenOracleConnection()) {
        e.Result = LoadSomethingFromDatabase(conn);
    }
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    DisplayLoadedData(e.Result);
}

ここまでは順調ですね。残念ながら、私は最近、このようなクエリを非常に高速に実行するコードをいくつか追加しましたが、それは単一のスレッドでのみです。そして現在、アプリケーションは時折、次の 2 つの動作のいずれかを示します。

  • などのまったく無害なメソッドで、Oracleコードのどこかにロックアップします"reader.GetInt32(string)"
  • CLR全体がクラッシュします。私がキャッチできる例外はありません。プロセス全体が即座に停止します。イベント ビューアでは、Oracle の DLL が障害のあるモジュールとして一覧表示されます。

確認したところ、ネットワーク接続や Oracle DB 自体に問題はありませんでした。また、スレッド間で Oracle 接続を共有していません。worker.DoWork のコードは ThreadPool のバックグラウンド スレッドで実行されますが、その特定の「conn」インスタンスは一度に 1 つのスレッドからのみアクセスされます (スレッドで実行されるメソッド内でローカル変数として宣言されていることを確認してください)。 .

この問題を修正する方法、または少なくともデバッグする方法について誰かアイデアがありますか? 他の誰かに起こったことはありますか?

更新:価値のあるものとして、ワーカー スレッドごとに単一の長時間実行 DB 接続を使用するように実装を切り替え、ワーカー スレッドの数を制限しました。これにより、この問題が発生する頻度が大幅に減少しましたが、残念ながら問題が完全に解消されたわけではありません.

4

0 に答える 0