0

Oracleデータベースと通信する分散トランザクションにNHibernateを使用する.NET4.0フレームワークで記述されたWindowsサービスがあります。テスト環境内で、サービスでデータベースでエラーが発生しました。これにより、NHibernateがADO.NET接続を閉じる際に問題が発生したようです。

セッションを開いてから破棄するまでのNHibernateに対する呼び出し全体は、System.Exceptionをキャッチするtry / catchブロック内にラップされますが、エラーはそのブロック内でキャッチされません。

参考までに、以下のWindowsイベントログからのスタックトレースを含めました。

例外が別のスレッド(スタックトレースが参照しているようです)でスローされ、それが伝播してWindowsサービスをクラッシュさせると思います。

私の質問は次のとおり
です。1。それが別のスレッドである場合、それはどこから来ていますか(何がそれを開始しますか)?
2.この例外がエスケープされてWindowsサービスが停止しないようにするために、コードに追加できるものはありますか?


アプリケーション:X
フレームワークバージョン:v4.0.30319
説明:未処理の例外が原因でプロセスが終了しました。
例外情報:NHibernate.ADOException
スタック:
NHibernate.Connection.ConnectionProvider.CloseConnection(System.Data.IDbConnection)
at NHibernate.Connection.DriverConnectionProvider.CloseConnection(System.Data.IDbConnection)
at NHibernate.AdoNet.ConnectionManager.CloseConnection()
at NHibernate .AdoNet.ConnectionManager.AfterTransaction()
at NHibernate.Impl.SessionImpl.AfterTransactionCompletion(Boolean、NHibernate.ITransaction)
at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory + <> c_ DisplayClass1.b_0(System.Object、System.Transactions.TransactionEventArgs)
at System.Transactions.TransactionCompletedEventHandler.Invoke(System.Object、System.Transactions.TransactionEventArgs)
at System.Transactions.TransactionStatePromotedAborted.EnterState(System.Transactions.InternalTransaction)
at System.Transactions .InternalTransaction.DistributedTransactionOutcome(System.Transactions.InternalTransaction、System.Transactions.TransactionStatus)
at System.Transactions.Oletx.RealOletxTransaction.FireOutcome(System.Transactions.TransactionStatus)
at System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcomeFunction(System )
at System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object、Boolean)
System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object、Boolean)で

4

1 に答える 1

0

それが別のスレッドである場合、それはどこから来ていますか(何がそれを開始しますか)?

の中NHibernate.Transaction.AdoNetWithDistributedTransactionFactoryには、のイベントハンドラがありSystem.Transactions.Transaction.TransactionCompletedます。このイベントは、スタックトレースの下部に示されているように、完了時に.NETFrameworkによってスレッドプールスレッドで発生します。

この例外がエスケープされてWindowsサービスが停止しないようにするために、コードに追加できるものはありますか?

正しいことは、例外が発生する理由を正確に突き止めることです。私はOracleを使用していませんが、DTCとSQL Serverを扱うこの特定の問題は実際にはありませんでした(他にもたくさんありますが)。問題の原因は、DTCまたはNHibernateのバグである可能性があります。

于 2012-12-12T05:08:56.040 に答える