.NET 4.5 Windows サービスで Oracle Advanced Queuing を使用しています。サービスは、Oracle Queue (11gR2) から読み取り、トランザクションでメッセージを処理する必要があります。これは、キュー内の最初のメッセージではうまく機能しますが、2 番目のメッセージを処理するときに、System.AccessViolationException が Oracle クライアントの奥深くでスローされます。
このサービスは、次のことをループで実行します。
- 新しいトランザクションを開始します (TransactionScope を使用)
- 新しい OracleConnection を作成します
- この接続で新しい OracleAQQueue を作成します
- OracleAQQueue の DequeueOptions.Wait プロパティを 3 に設定します。
- OracleConnection を開きます
- OracleAQQueue で Dequeue() をコールします
- カスタム ビジネス ロジックを使用してメッセージを処理する
- 1)からのトランザクションを完了する(コミットする)
- OracleAQQueue および OracleConnection を破棄する
キュー内の最初のメッセージが処理されますが、次のループで次の StrackTrace が取得され、Windows サービスが終了します。
System.AccessViolationException スタック: Oracle.DataAccess.Client.OpsAQ.FreeCachedDesc (IntPtr ByRef、IntPtr ByRef、IntPtr ByRef) で Oracle.DataAccess.Client.OpsAQ.FreeCachedDesc (IntPtr ByRef、IntPtr ByRef、IntPtr ByRef) で Oracle.DataAccess.Client.OracleAQQueue.Dispose(ブール値)で StarTrack.Common.Messaging.AQ.InternalOracleQueue.Dispose() で ....
Oracle クライアント 11.2.0.3.0 (64 ビット) を使用しています。
更新: 12.1.0.1.0 (64 ビット) クライアントでも試してみましたが、同じ問題です。
誰かが同様の問題でOracle Advanced Queueingを実行し、それを解決しましたか?
よろしく、 マーカス