The posted code might not be very relevant to figuring out the problem.f StaleObjectstateException should mean that you have an object in memory, that NHibernate detects have been updated in the database by someone else (meaning "another session"). If the exception goes away for a while on IIS reset but then consistently comes back, it sound like you may be holding on to some database objects for an extended period of time (possibly disconnecting them from a session and then attaching them to a new one). I think that's where you need to start thinking to find the problem.
If your users are frequently updating the same objects, this may be a fact of life (meaning you might need to design the program to avoid it). /Oskar 2016-04-27 16:59 GMT+01:00 Kaleem Uddin Mohammed Abdul < [email protected]>: > The Scope of the class is public and in GetSession method we open the > session and in Commit Method we closed the session! > > On Tuesday, April 26, 2016 at 5:45:51 PM UTC-5, Gunnar Liljas wrote: >> >> What is the scope of this class? Where is the session stored? When is it >> opened and closed? >> >> 2016-04-27 0:25 GMT+02:00 Kaleem Uddin Mohammed Abdul < >> [email protected]>: >> >>> Greetings Expert, >>> >>> We are getting StaleObject Exception often but it goes away after IIS >>> Reset. We searched on the internet and not able to find the proper answer >>> :(. >>> >>> private ISessionFactory GetFactory() >>> { >>> INetLog _log = ObjectFactory.GetInstance<INetLog>(); >>> _log.ArchStart("NHSession.GetFactory", ""); >>> // create factory if not already built >>> if (localFactory == null) >>> { >>> string[] nameParts = DBNameAndHasTran.Split(new char[] { '_' >>> }); >>> // StructureMap will cache this by singlton >>> INHFactory nHFactoryHdl = >>> ObjectFactory.GetNamedInstance<INHFactory>(nameParts[0]); >>> localFactory = nHFactoryHdl.GetFactory(); >>> _log.ArchDebug("Got the factory from sington. Put it in >>> localFactory"); >>> } >>> else >>> { >>> _log.ArchDebug("Used the localFactory"); >>> } >>> _log.ArchEnd(); >>> return localFactory; >>> } >>> >>> public ISession GetSession() >>> { >>> INetLog _log = ObjectFactory.GetInstance<INetLog>(); >>> _log.ArchStart("NHSession.GetSession", ""); >>> if (localSession == null) >>> { >>> // error check DBNameHasTran >>> string[] nameParts = DBNameAndHasTran.Split(new char[] { '_' >>> }); >>> if (nameParts.Length < 2) >>> throw new Exception("Invalid value for >>> DBNameAndHasTran:" + DBNameAndHasTran + " it is missing a _"); >>> >>> if (nameParts.Length > 2) >>> throw new Exception("Invalid value for >>> DBNameAndHasTran:" + DBNameAndHasTran + " it has too many _"); >>> >>> if ((nameParts[1] != "HasTrans") && (nameParts[1] != >>> "HasNoTrans")) >>> throw new Exception("Invalid value for >>> DBNameAndHasTran:" + DBNameAndHasTran + " missing _HasTrans or >>> _HasNoTrans"); >>> >>> // get the factory >>> _log.ArchDebug("GetSession From Factory"); >>> localSession = GetFactory().OpenSession(); >>> >>> // start transaction if InTrans == true >>> if (nameParts[1] == "HasTrans") >>> { >>> if (localSession.Transaction == null || >>> !localSession.Transaction.IsActive) >>> { >>> _log.ArchDebug("Call to BeginTransaction"); >>> localTransaction = localSession.BeginTransaction(); >>> >>> TransactionStarted = true; >>> } >>> } >>> } >>> else >>> { >>> _log.ArchDebug("Not Creating a Session Object using >>> localSession"); >>> } >>> >>> _log.ArchEnd(); >>> return localSession; >>> } >>> >>> public void CloseOutSession() >>> { >>> INetLog _log = ObjectFactory.GetInstance<INetLog>(); >>> _log.ArchStart("NHSession.CloseOutSession", ""); >>> >>> // log if trying to close a closed session >>> if (localSession == null) >>> { >>> _log.ArchDebug("In CloseOutSession local session is null."); >>> // who called us >>> StackTrace stackTrace = new StackTrace(); // get >>> call stack >>> StackFrame[] stackFrames = stackTrace.GetFrames(); // get >>> method calls (frames) >>> >>> string msg = ""; >>> // write call stack to determine why CloseOutSession is >>> called so frequently >>> foreach (StackFrame stackFrame in stackFrames) >>> { >>> if (msg == "") >>> { >>> msg = "I was called by " + >>> stackFrame.GetMethod().Name; >>> } >>> else >>> { >>> msg += ", who was called by " + >>> stackFrame.GetMethod().Name; >>> } >>> } >>> >>> _log.ArchDebug(msg); >>> _log.ArchEnd(); >>> return; >>> } >>> >>> // log error if session is not open >>> if (!localSession.IsOpen) >>> { >>> _log.ArchDebug("In CloseOutSession local session is not >>> open. "); >>> _log.ArchEnd(); >>> return; >>> } >>> >>> _log.ArchDebug("In CloseOutSession Found session to kill"); >>> if (localSession.Transaction != null && >>> localSession.Transaction.IsActive) >>> { >>> _log.ArchDebug("In CloseOutSession Found Transaction to >>> rollback."); >>> localSession.Transaction.Rollback(); >>> //localSession = null; >>> } >>> else >>> { >>> _log.ArchDebug("In CloseOutSession. Did not find any >>> unprocessed transactions so did a flush"); >>> localSession.Flush(); >>> } >>> >>> // checked above so there is not a null reference possiblity >>> if (localSession.Transaction != null) >>> { >>> localSession.Transaction.Dispose(); >>> } >>> >>> localSession.Close(); >>> localSession.Dispose(); >>> localSession = null; >>> localTransaction = null; >>> _log.ArchEnd(); >>> } >>> >>> public void Commit() >>> { >>> INetLog _log = ObjectFactory.GetInstance<INetLog>(); >>> _log.ArchStart("NHSession.Commit", ""); >>> >>> // exit out if there is no session. >>> if (localSession == null) >>> { >>> _log.ArchDebug("In Commit local session is null. This is a >>> indication that GetSession was not called before commit. This means no >>> work to commit"); >>> _log.ArchEnd(); >>> return; >>> } >>> >>> // log error if session is not open >>> if (!localSession.IsOpen) >>> { >>> _log.ArchDebug("In Commit local session is not open. This is >>> a indication that NHSession was not called before commit. This means no >>> work to commit"); >>> CloseOutSession(); >>> _log.ArchEnd(); >>> return; >>> } >>> >>> // log error if not transaction mode. >>> if (localTransaction == null) >>> { >>> _log.ArchDebug("In Commit localTransaction is null. This is a >>> indication that NHSession was not was not open in transaction mode."); >>> CloseOutSession(); >>> _log.ArchEnd(); >>> return; >>> } >>> >>> try >>> { >>> // do the commit >>> _log.ArchDebug("In Commit printing out Statistics"); >>> _log.ArchDebug(localSession.Statistics.ToString()); >>> localTransaction.Commit(); >>> } >>> catch (Exception ex) >>> { >>> >>> throw; >>> } >>> finally >>> { >>> CloseOutSession(); >>> _log.ArchEnd(); >>> } >>> } >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "nhusers" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at https://groups.google.com/group/nhusers. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/nhusers. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/nhusers. For more options, visit https://groups.google.com/d/optout.
