0

結束分佈式事務我已經寫在使用NHibernate的爭取在分佈式事務交談Oracle數據庫的.NET 4.0框架的Windows服務。在我們的測試環境中,該服務遇到了一個數據庫錯誤,這似乎是NHibernate關閉ADO.NET連接導致的一個問題。異常導致Windows服務崩潰與NHibernate的

對NHibernate的整個呼叫,從會議開幕到它處置時,映入System.Exception的一個try/catch塊內進行包裝,而該塊內沒有被捕獲的錯誤。

我已經包括從下面的Windows事件日誌以供參考堆棧跟蹤。

我相信,異常在另一個線程(堆棧跟蹤似乎是指)被拋出,然後propogates起來,使窗口服務崩潰。

我的問題是:
1.如果是另一個線程,它從哪裏來(它是從什麼開始的)?
2.請問有什麼可以添加到我的代碼,以確保此異常不會逃避,搞垮窗口服務?


應用:X
Framework版本: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.ITransaction)
在NHibernate.Transaction.AdoNetWithDistributedTransactionFactory + <> C_ DisplayClass1.b _0(System.Object的,System.Transactions.TransactionEventArgs)
在System.Transactions.TransactionCompletedEventHandler.Invoke(System.Object的,System.Transactions.TransactionEventArgs)
在System.Transactions.TransactionStatePromotedAborted。 EnterState(System.Transactions.InternalTransaction)
在System.Transactions.InternalTransaction.DistributedTransactionOutcome(System.Transactions.InternalTransaction,System.Transactions.TransactionStatus)
在System.Transactions.Oletx.RealOletxTransaction.FireOutcome(System.Transactions.TransactionStatus)
在System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcome函數(System.Transactions.TransactionStatus)
在System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object的,布爾值)
在System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object的,布爾值)

回答

0

如果它是另一個線程,它從哪裏來(它是從什麼開始的)?

NHibernate.Transaction.AdoNetWithDistributedTransactionFactory,存在着對System.Transactions.Transaction.TransactionCompleted事件處理程序。完成後,.NET框架會在線程池線程上觸發此事件,如堆棧跟蹤的底部所示。

有什麼我可以添加到我的代碼,以確保此異常不會逃避,搞垮窗口服務?

正確的做法是準確追捕爲什麼發生異常。我沒有使用Oracle,但並沒有真正處理DTC和SQL Server的這個特殊問題(儘管還有很多其他的問題)。問題的根源可能是DTC或NHibernate中的錯誤。

+0

感謝這個信息 - 似乎在我們的環境。 Oracle強制關閉由於資源壓力造成的連接,當它試圖關閉DBConnection本身時,它肯定會導致在NHibernate代碼中拋出異常,然後將其作爲NHibernate.ADOException被捕獲並拋出。 我們設法通過向數據庫服務器添加更多內存(這有點動力不足)來阻止這種情況的發生 - 因爲這樣做我們沒有再次遇到這種異常。 – lowds

相關問題