Stale State Windows Service Freezing

34 views
Skip to first unread message

Carl

unread,
Feb 3, 2011, 3:51:22 PM2/3/11
to nhusers
Hello there,

We are having intermittent problems with a windows service running
over WCF (single instance) with NHibernate.

We are getting occasional errors that are causing our service to fail:

11:35:27.023 [26] ERROR
NHibernate.Event.Default.AbstractFlushingEventListener - Could not
synchronize database state with session
NHibernate.StaleStateException: Unexpected row count: 0; expected: 1
at
NHibernate.AdoNet.Expectations.BasicExpectation.VerifyOutcomeNonBatched(Int32
rowCount, IDbCommand statement)
at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation
expectation)
at NHibernate.Persister.Entity.AbstractEntityPersister.Delete(Object
id, Object version, Int32 j, Object obj, SqlCommandInfo sql,
ISessionImplementor session, Object[] loadedState)
at NHibernate.Persister.Entity.AbstractEntityPersister.Delete(Object
id, Object version, Object obj, ISessionImplementor session)
at NHibernate.Action.EntityDeleteAction.Execute()
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
at
NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource
session)
12:44:13.357 [38] ERROR NHibernate.Transaction.AdoTransaction - Commit
failed
System.Data.SqlClient.SqlException: The COMMIT TRANSACTION request has
no corresponding BEGIN TRANSACTION.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection)
at
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject
stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,
SqlCommand cmdHandler, SqlDataReader dataStream,
BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
stateObj)
at
System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[]
buffer, TransactionManagerRequestType request, String transactionName,
TransactionManagerIsolationLevel isoLevel, Int32 timeout,
SqlInternalTransaction transaction, TdsParserStateObject stateObj,
Boolean isDelegateControlRequest)
at
System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest
transactionRequest, String transactionName, IsolationLevel iso,
SqlInternalTransaction internalTransaction, Boolean
isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalTransaction.Commit()
at System.Data.SqlClient.SqlTransaction.Commit()
at NHibernate.Transaction.AdoTransaction.Commit()

and

NHibernate.HibernateException: disconnected session
at
NHibernate.Collection.AbstractPersistentCollection.ForceInitialization()
at
NHibernate.Engine.StatefulPersistenceContext.InitializeNonLazyCollections()
at
NHibernate.Event.Default.DefaultLoadEventListener.AssembleCacheEntry(CacheEntry
entry, Object id, IEntityPersister persister, LoadEvent event)
at
NHibernate.Event.Default.DefaultLoadEventListener.LoadFromSecondLevelCache(LoadEvent
event, IEntityPersister persister, LoadType options)
at NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent
event, IEntityPersister persister, EntityKey keyToLoad, LoadType
options)
at NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent
event, IEntityPersister persister, EntityKey keyToLoad, LoadType
options)
at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent
event, LoadType loadType)
at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType
loadType)
at NHibernate.Impl.SessionImpl.InternalLoad(String entityName, Object
id, Boolean eager, Boolean isNullable)
at NHibernate.Type.EntityType.ResolveIdentifier(Object id,
ISessionImplementor session)
at NHibernate.Type.TypeFactory.Assemble(Object[] row,
ICacheAssembler[] types, ISessionImplementor session, Object owner)
at NHibernate.Cache.Entry.CacheEntry.Assemble(Object[] values, Object
result, Object id, IEntityPersister persister, IInterceptor
interceptor, ISessionImplementor session)
at
NHibernate.Event.Default.DefaultLoadEventListener.AssembleCacheEntry(CacheEntry
entry, Object id, IEntityPersister persister, LoadEvent event)
at
NHibernate.Event.Default.DefaultLoadEventListener.LoadFromSecondLevelCache(LoadEvent
event, IEntityPersister persister, LoadType options)
at NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent
event, IEntityPersister persister, EntityKey keyToLoad, LoadType
options)
at NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent
event, IEntityPersister persister, EntityKey keyToLoad, LoadType
options)
at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent
event, LoadType loadType)
at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType
loadType)
at NHibernate.Impl.SessionImpl.Get(Type clazz, Object id, LockMode
lockMode)
at X.X.DomainData.Implementation.CoreDao.GetEntity[T](Object id)
at X.X.DomainData.Implementation.UserDao.GetThing(Int32 engineerId)
at
X.X.CaseManagement.Implementation.Managers.UserManager.GetThing(Int32
engineerID)

Here is our session manager:

Code:
using System;
using NHibernate;
using NHibernate.Cfg;

namespace X.X.DomainData.Implementation
{
public sealed class SessionManager
{
[ThreadStatic] private static ISession _session;
private readonly Configuration _configuration;
private readonly ISessionFactory _sessionFactory;

#region Constructor

#region Singleton

public static SessionManager Instance
{
get { return Singleton.Instance; }
}

private class Singleton
{
internal static readonly SessionManager Instance = new
SessionManager();
}

#endregion

private SessionManager()
{
_configuration = new Configuration();
Configuration.Configure();

Configuration.AddAssembly(GetType().Assembly);
Configuration.Properties.Add("prevalenceBase", "cmm-
cache");

//get the session factory
_sessionFactory = Configuration.BuildSessionFactory();
}

#endregion

#region NHibernate Setup

public Configuration Configuration
{
get { return _configuration; }
}


internal ISessionFactory SessionFactory
{
get { return _sessionFactory; }
}
public void Close()
{
SessionFactory.Close();
}

#endregion

#region NHibernate Sessions

public ISession Session
{
get
{
ISession session = _session;

//if it's an open session, that's all
if (session != null && session.IsOpen)
return session;

//if not open, open a new session
return OpenSession();
}
}

public ISession OpenSession()
{
ISession session = SessionFactory.OpenSession();
_session = session;
return session;
}

#endregion
}
}


We are using this property:

<property name="current_session_context_class">thread_static</
property>

Can anybody explain what causes this error, why it causes the service
to freeze and how we can get around it?

Many thanks in anticipation,

Carl

Fabio Maulo

unread,
Feb 3, 2011, 3:57:58 PM2/3/11
to nhu...@googlegroups.com
even if you are setting "current_session_context_class" then you are not using it in your code.
Btw the error seems not to be related with session management.
The "NHibernate.StaleStateException: Unexpected row count: 0; expected: 1" is when:
- you are updating an entity and it was deleted
- you are deleting an entity and it was already deleted
- you are updating a versioned entity and it was updated by another call
- ... and so on


--
You received this message because you are subscribed to the Google Groups "nhusers" group.
To post to this group, send email to nhu...@googlegroups.com.
To unsubscribe from this group, send email to nhusers+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.




--
Fabio Maulo

Fabio Maulo

unread,
Feb 3, 2011, 3:59:21 PM2/3/11
to nhu...@googlegroups.com
Only one of the available examples in the cloud
--
Fabio Maulo

Reply all
Reply to author
Forward
0 new messages