Adam
unread,Feb 1, 2011, 12:51:50 PM2/1/11Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to Rhino Tools Dev
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