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.

Reply via email to