我在 .NET 4.5 Windows 服务中使用 Oracle 高级队列。该服务应从 Oracle 队列 (11gR2) 中读取并处理事务中的消息。这适用于队列中的第一条消息,但在处理第二条消息时,Oracle 客户端内部深处会引发 System.AccessViolationException。
该服务循环执行以下操作:
- 开始一个新事务(使用 TransactionScope)
- 创建一个新的 OracleConnection
- 使用此连接创建一个新的 OracleAQQueue
- 将 OracleAQQueue 的 DequeueOptions.Wait 属性设置为 3
- 打开 Oracle 连接
- 在 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 Queuing 并解决了它?
最好的问候,马库斯