.net 异常导致windows服务在使用NHibernate结束分布式事务时崩溃

.net 异常导致windows服务在使用NHibernate结束分布式事务时崩溃,.net,nhibernate,windows-services,distributed-transactions,.net,Nhibernate,Windows Services,Distributed Transactions,我有一个用.NET4.0框架编写的windows服务,它在与Oracle数据库对话的分布式事务中使用NHibernate登记。在我们的测试环境中,服务遇到数据库错误,这似乎导致NHibernate关闭ADO.NET连接时出现问题 对NHibernate的整个调用,从打开会话到处理会话,都被包装在一个try/catch块中,该块捕获System.Exception,但在该块中不会捕获错误 我已将windows事件日志中的堆栈跟踪包含在下面以供参考 我相信异常正在另一个线程中抛出(堆栈跟踪似乎引用了

我有一个用.NET4.0框架编写的windows服务,它在与Oracle数据库对话的分布式事务中使用NHibernate登记。在我们的测试环境中,服务遇到数据库错误,这似乎导致NHibernate关闭ADO.NET连接时出现问题

对NHibernate的整个调用,从打开会话到处理会话,都被包装在一个try/catch块中,该块捕获System.Exception,但在该块中不会捕获错误

我已将windows事件日志中的堆栈跟踪包含在下面以供参考

我相信异常正在另一个线程中抛出(堆栈跟踪似乎引用了该线程),然后该线程将抛出并导致windows服务崩溃

我的问题是:
1.如果它是另一个线程,它来自哪里(它是从什么开始的)?
2.有什么我可以添加到我的代码,以确保此异常不会逃脱并导致windows服务关闭


应用:X
框架版本:v4.0.30319
描述:由于未处理的异常,进程已终止。
异常信息:NHibernate.ADOException
堆栈:
在NHibernate.Connection.ConnectionProvider.CloseConnection(System.Data.IDbConnection)上
在NHibernate.Connection.DriverConnectionProvider.CloseConnection(System.Data.IDbConnection)
在NHibernate.AdoNet.ConnectionManager.CloseConnection()上 在NHibernate.AdoNet.ConnectionManager.AfterTransaction()上 在NHibernate.Impl.SessionImpl.AfterTransactionCompletion(布尔值,NHibernate.itTransaction)
在NHibernate.Transaction.adonnetwithDistributedTransactionFactory+c_DisplayClass1.b_0(System.Object,System.Transactions.TransactionEventArgs)
位于System.Transactions.TransactionCompletedEventHandler.Invoke(System.Object,System.Transactions.TransactionEventTargets)
在System.Transactions.TransactionStatePromotedAborted.EnterState(System.Transactions.InternalTransaction)
在System.Transactions.InternalTransaction.DistributedTransactionOutput(System.Transactions.InternalTransaction,System.Transactions.TransactionStatus)
在System.Transactions.Oletx.RealOletxTransaction.FireOutput(System.Transactions.TransactionStatus)上
在System.Transactions.Oletx.OutcomeEnrolment.InvokeOutcomeFunction(System.Transactions.TransactionStatus)中
在System.Transactions.Oletx.OletxtTransactionManager.ShimNotificationCallback(System.Object,布尔值)
在System.Threading.\u ThreadPoolWaitorTimeCarlBack.PerformWaitorTimeCarlBack(System.Object,布尔值)

如果它是另一个线程,它来自哪里(它是从什么开始的)

NHibernate.Transaction.adonnetwithdistributedtransactionfactory
内部,存在
System.Transactions.Transaction.TransactionCompleted
的事件处理程序。此事件在完成时由.NET framework在线程池线程上激发,如堆栈跟踪底部所示

有什么我可以添加到我的代码,以确保此异常不会逃脱并导致windows服务关闭


正确的做法是找出异常发生的确切原因。我没有使用过Oracle,但在处理DTC和SQL Server时并没有遇到这个特殊问题(尽管还有很多其他问题)。问题的根源可能是DTC或NHibernate中的错误。

感谢您提供的信息-在我们的环境中似乎是这样。由于资源压力,Oracle正在强制关闭连接,这一定导致在试图关闭DBConnection本身时在NHibernate代码中引发异常,然后该异常被捕获并作为NHibernate.ADOException引发。我们设法通过向数据库服务器添加更多的RAM来阻止这种情况的发生(这在某种程度上是动力不足的)——因为这样做,我们没有再次遇到这种异常。