長期間実行される可能性のあるOracleストアド・プロシージャから返された結果を示すレポート・ウィンドウがあります。私の問題は、ユーザーがオラクルへの接続が開いたままで、潜在的に長時間実行されているレポートが取り消されないというウィンドウを閉じるときです。C#で強制的にOracle接続を閉じる
オープン接続を閉じる唯一の方法は、DBAが手動で強制終了するか、ユーザーがアプリケーション全体を終了するかのどちらかです。
私は別のスレッドからの接続でClose
を呼び出してみましたが、これは連続的にブロックされているようです。私もトランザクションをロールバックしようとしましたが、これは同じ問題を呈します。
唯一の解決策は、別のプロセス(または多分アプリドメインですか?)でクエリを実行することです。
私は明らかに何かが不足している可能性が高い、どんな助けも大歓迎です。
この質問はusing
文の中で私の接続をラップに関するものではありませんお読みください。 は、閉じるために問合せを実行しているOracle接続を強制的に実行する方法です。
例:
- スタートクエリを実行しているスレッド
- スタッシュ接続オブジェクトのどこかに
近い接続オブジェクト
public void Go() { OracleConnection connection; var queryThread = new Thread( () => { using (connection = OpenOracleConnection()) { // execute stored proc that takes 45 mins // raise an event with the data set we load } }); Thread.Sleep(3000); // give it time to be useless var closeThread = new Thread( () => { connection.Close(); }); closeThread.Start(); }
上のコールに問題があることですこれは接続を閉じるのではなく、connection.Cプロシージャの実行を待っているブロックを失う。
のOracleプロバイダをADO.NETあなたはどちらを使用していますか?(マイクロソフトは、非同期処理をサポートしていないので、別の接続で接続して問題のプロセスを停止するコードを記述する必要があるかもしれません)。 – driis
11.2.0に付属するOracle.DataAccessプロバイダです。 – jonnii
よくある質問です。明らかに、最初にクエリを中止する必要があります。この電車の動きをどのように設定するかを説明するまで、答えは得られません。「レポートウィンドウ」は無意味です。郵便番号。 –