Hi, I've successfully implemented RSB+NHibernate for a project and everything works great when I have the RSB thread count set to 1. If I try to increase the thread count, I will eventually get an unhandled exception from NHiberbate causing the entire application to fail (service to stop when running as a service). The unhandled exception is logged in the Event Log, and in my log4Net log, I get 3 errors from NHibernate at the same time talking about a deadlock.
I am fully expecting a deadlock to occur in a mutlti-threaded environment, and sometimes the RSB application processes several hundread messages before crashing, other times its just a handful. I've implemented a MessageModule to handle the NHIbernate session as shown in Ayende's MSDN article and also as shown in a couple of posts on this group. I'm going to dig into this a little more, as well as make sure I'm running the latest versions of RSB and NHibernate, but thought I would post now to see if anyone has an idea of where I could focus my effort in resolving this issue. Unhandled Exception: Application: Rhino.ServiceBus.Host.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.InvalidOperationException Stack: at NHibernate.AdoNet.ConnectionManager.Disconnect() at NHibernate.AdoNet.ConnectionManager.Close() at NHibernate.Impl.SessionImpl.Close() at NHibernate.Impl.SessionImpl.Dispose(Boolean) at NHibernate.Impl.SessionImpl.CloseSessionFromDistributedTransaction() at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory +<>c__DisplayClass1.<EnlistInDistributedTransactionIfNeeded>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.Transactions.TransactionStatus) at System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object, Boolean) at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean) Errors in log4net Logging, which I expect, and also get sometimes w/o the whole application crashing. 2011-02-01 11:28:20,499 [18] WARN NHibernate.Util.ADOExceptionReporter [(null)] - System.Data.SqlClient.SqlException (0x80131904): Transaction (Process ID 59) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery() at NHibernate.AdoNet.SqlClientSqlCommandSet.ExecuteNonQuery() in d: \CSharp\NH\nhibernate\src\NHibernate\AdoNet \SqlClientSqlCommandSet.cs:line 117 at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps) in d:\CSharp\NH\nhibernate\src\NHibernate\AdoNet \SqlClientBatchingBatcher.cs:line 91 2011-02-01 11:28:20,570 [18] ERROR NHibernate.Util.ADOExceptionReporter [(null)] - Transaction (Process ID 59) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 2011-02-01 11:28:20,574 [18] ERROR NHibernate.Event.Default.AbstractFlushingEventListener [(null)] - Could not synchronize database state with session NHibernate.Exceptions.GenericADOException: could not execute batch command.[SQL: SQL not available] ---> System.Data.SqlClient.SqlException: Transaction (Process ID 59) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.SqlClient.SqlCommandSet.ExecuteNonQuery() at NHibernate.AdoNet.SqlClientSqlCommandSet.ExecuteNonQuery() in d: \CSharp\NH\nhibernate\src\NHibernate\AdoNet \SqlClientSqlCommandSet.cs:line 117 at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps) in d:\CSharp\NH\nhibernate\src\NHibernate\AdoNet \SqlClientBatchingBatcher.cs:line 91 --- End of inner exception stack trace --- at NHibernate.AdoNet.SqlClientBatchingBatcher.DoExecuteBatch(IDbCommand ps) in d:\CSharp\NH\nhibernate\src\NHibernate\AdoNet \SqlClientBatchingBatcher.cs:line 103 at NHibernate.AdoNet.AbstractBatcher.ExecuteBatchWithTiming(IDbCommand ps) in d:\CSharp\NH\nhibernate\src\NHibernate\AdoNet \AbstractBatcher.cs:line 431 at NHibernate.AdoNet.AbstractBatcher.ExecuteBatch() in d:\CSharp\NH \nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line 416 at NHibernate.AdoNet.AbstractBatcher.OnPreparedCommand() in d: \CSharp\NH\nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line 168 at NHibernate.AdoNet.AbstractBatcher.PrepareCommand(CommandType type, SqlString sql, SqlType[] parameterTypes) in d:\CSharp\NH \nhibernate\src\NHibernate\AdoNet\AbstractBatcher.cs:line 155 at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) in d:\CSharp\NH \nhibernate\src\NHibernate\Persister\Entity \AbstractEntityPersister.cs:line 2722 at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) in d:\CSharp\NH \nhibernate\src\NHibernate\Persister\Entity \AbstractEntityPersister.cs:line 2689 at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) in d:\CSharp\NH\nhibernate\src\NHibernate \Persister\Entity\AbstractEntityPersister.cs:line 2965 at NHibernate.Action.EntityUpdateAction.Execute() in d:\CSharp\NH \nhibernate\src\NHibernate\Action\EntityUpdateAction.cs:line 79 at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in d:\CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 136 at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d: \CSharp\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 126 at NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH \nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 170 at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in d:\CSharp\NH\nhibernate\src\NHibernate\Event\Default \AbstractFlushingEventListener.cs:line 241 -- You received this message because you are subscribed to the Google Groups "Rhino Tools Dev" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rhino-tools-dev?hl=en.
