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.
