2

我在 .NET 4.5 Windows 服务中使用 Oracle 高级队列。该服务应从 Oracle 队列 (11gR2) 中读取并处理事务中的消息。这适用于队列中的第一条消息,但在处理第二条消息时,Oracle 客户端内部深处会引​​发 System.AccessViolationException。

该服务循环执行以下操作:

  1. 开始一个新事务(使用 TransactionScope)
  2. 创建一个新的 OracleConnection
  3. 使用此连接创建一个新的 OracleAQQueue
  4. 将 OracleAQQueue 的 DequeueOptions.Wait 属性设置为 3
  5. 打开 Oracle 连接
  6. 在 OracleAQQueue 上调用 Dequeue()
  7. 使用自定义业务逻辑处理消息
  8. 完成(提交)来自 1) 的事务
  9. 处理 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 Queuing 并解决了它?

最好的问候,马库斯

4

0 回答 0