-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Stale State and Session Problems
PostPosted: Wed Feb 02, 2011 7:47 am 
Beginner
Beginner

Joined: Wed Oct 18, 2006 4:41 am
Posts: 20
Location: West Yorkshire, UK
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


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.