Btw, doesn't the exception tell you which object is affected if you look at the message, including the message of all InnerExceptions recursively?
2016-04-27 21:16 GMT+01:00 Kaleem Uddin Mohammed Abdul < [email protected]>: > Thanks Oskar! > > I will try to follow these points and try to reproduce by updating the > same object multiple times! > > On Wednesday, April 27, 2016 at 12:12:52 PM UTC-5, Oskar Berggren wrote: >> >> 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. > -- 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.
